don't redefine width() and height()

Qt widgets define width() and height() to be in device independent
pixels. Don't change that meaning.
This commit is contained in:
KIU Shueng Chuan 2021-07-17 10:14:53 +08:00
parent e158034c07
commit ee9b1565bd

View File

@ -71,14 +71,13 @@ class GLViewWidget(QtWidgets.QOpenGLWidget):
window.screenChanged.connect(self._updateScreen) window.screenChanged.connect(self._updateScreen)
self._updateScreen(window.screen()) self._updateScreen(window.screen())
def width(self): def deviceWidth(self):
dpr = self.devicePixelRatio() dpr = self.devicePixelRatio()
return int(super().width() * dpr) return int(self.width() * dpr)
def height(self): def deviceHeight(self):
dpr = self.devicePixelRatio() dpr = self.devicePixelRatio()
return int(super().height() * dpr) return int(self.height() * dpr)
def reset(self): def reset(self):
""" """
@ -143,8 +142,10 @@ class GLViewWidget(QtWidgets.QOpenGLWidget):
def getViewport(self): def getViewport(self):
vp = self.opts['viewport'] vp = self.opts['viewport']
if vp is None: if vp is None:
return (0, 0, self.width(), self.height()) return (0, 0, self.deviceWidth(), self.deviceHeight())
else: else:
# note: the following code means that we have defined opts['viewport']
# to be in device independent pixels.
dpr = self.devicePixelRatio() dpr = self.devicePixelRatio()
return tuple([int(x * dpr) for x in vp]) return tuple([int(x * dpr) for x in vp])
@ -165,7 +166,7 @@ class GLViewWidget(QtWidgets.QOpenGLWidget):
def projectionMatrix(self, region=None): def projectionMatrix(self, region=None):
if region is None: if region is None:
region = (0, 0, self.width(), self.height()) region = (0, 0, self.deviceWidth(), self.deviceHeight())
x0, y0, w, h = self.getViewport() x0, y0, w, h = self.getViewport()
dist = self.opts['distance'] dist = self.opts['distance']
@ -211,7 +212,7 @@ class GLViewWidget(QtWidgets.QOpenGLWidget):
Return a list of the items displayed in the region (x, y, w, h) Return a list of the items displayed in the region (x, y, w, h)
relative to the widget. relative to the widget.
""" """
region = (region[0], self.height()-(region[1]+region[3]), region[2], region[3]) region = (region[0], self.deviceHeight()-(region[1]+region[3]), region[2], region[3])
#buf = np.zeros(100000, dtype=np.uint) #buf = np.zeros(100000, dtype=np.uint)
buf = glSelectBuffer(100000) buf = glSelectBuffer(100000)
@ -378,7 +379,7 @@ class GLViewWidget(QtWidgets.QOpenGLWidget):
cVec = self.opts['center'] - cPos cVec = self.opts['center'] - cPos
dist = cVec.length() ## distance from camera to center dist = cVec.length() ## distance from camera to center
xDist = dist * 2. * tan(0.5 * radians(self.opts['fov'])) ## approx. width of view at distance of center point xDist = dist * 2. * tan(0.5 * radians(self.opts['fov'])) ## approx. width of view at distance of center point
xScale = xDist / self.width() xScale = xDist / self.deviceWidth()
zVec = QtGui.QVector3D(0,0,1) zVec = QtGui.QVector3D(0,0,1)
xVec = QtGui.QVector3D.crossProduct(zVec, cVec).normalized() xVec = QtGui.QVector3D.crossProduct(zVec, cVec).normalized()
yVec = QtGui.QVector3D.crossProduct(xVec, zVec).normalized() yVec = QtGui.QVector3D.crossProduct(xVec, zVec).normalized()
@ -403,7 +404,7 @@ class GLViewWidget(QtWidgets.QOpenGLWidget):
fov = radians(self.opts['fov']) fov = radians(self.opts['fov'])
dist = (self.opts['center'] - self.cameraPosition()).length() dist = (self.opts['center'] - self.cameraPosition()).length()
fov_factor = tan(fov / 2) * 2 fov_factor = tan(fov / 2) * 2
scale_factor = dist * fov_factor / self.width() scale_factor = dist * fov_factor / self.deviceWidth()
z = scale_factor * cos(elev) * dy z = scale_factor * cos(elev) * dy
x = scale_factor * (sin(azim) * dx - sin(elev) * cos(azim) * dy) x = scale_factor * (sin(azim) * dx - sin(elev) * cos(azim) * dy)
y = scale_factor * (cos(azim) * dx + sin(elev) * sin(azim) * dy) y = scale_factor * (cos(azim) * dx + sin(elev) * sin(azim) * dy)
@ -425,7 +426,7 @@ class GLViewWidget(QtWidgets.QOpenGLWidget):
else: else:
dist = (pos-cam).length() dist = (pos-cam).length()
xDist = dist * 2. * tan(0.5 * radians(self.opts['fov'])) xDist = dist * 2. * tan(0.5 * radians(self.opts['fov']))
return xDist / self.width() return xDist / self.deviceWidth()
def mousePressEvent(self, ev): def mousePressEvent(self, ev):
lpos = ev.position() if hasattr(ev, 'position') else ev.localPos() lpos = ev.position() if hasattr(ev, 'position') else ev.localPos()
@ -543,8 +544,8 @@ class GLViewWidget(QtWidgets.QOpenGLWidget):
""" """
Read the current buffer pixels out as a QImage. Read the current buffer pixels out as a QImage.
""" """
w = self.width() w = self.deviceWidth()
h = self.height() h = self.deviceHeight()
self.repaint() self.repaint()
pixels = np.empty((h, w, 4), dtype=np.ubyte) pixels = np.empty((h, w, 4), dtype=np.ubyte)
pixels[:] = 128 pixels[:] = 128