PyQt QGLWidget不会保留纵横比

时间:2015-12-14 16:51:05

标签: python qt opengl pyqt pyopengl

我在布局PyQt窗口时遇到问题。我使用了一个带有一个大QGLWidget的网格布局,下面有许多较小的控制组件。使用以下代码对QGLWidget进行子类化时:

class GLWidget(QtOpenGL.QGLWidget):
    def __init__(self, parent=None):
        self.parent = parent
        QtOpenGL.QGLWidget.__init__(self, parent)
        sizePol=QSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred)
        sizePol.setWidthForHeight(True)
        self.setSizePolicy(sizePol)

    def sizeHint(self):
        return QSize(300,450)

    def widthForHeight(self,height):
        return int(height/1.5)

我使用以下代码创建lyout:

class MainWidget(QtGui.QWidget): 
    def __init__(self, parent = None):
        super(MainWidget, self).__init__(parent)    
        self.ogl_widget = GLWidget(self)
        grid = QtGui.QGridLayout()
        grid.setSizeConstraint(QtGui.QLayout.SetMinimumSize)
        grid.addWidget(self.ogl_widget, 0,0,1,6)
        #add other control components 
        <add LineEdits and Labels>
        <their size policy is vertical: fixed, horizontal: expanding>

但是,QGLWidget的大小没有变化。它总是用所产生的任意宽高比填充剩余空间。我需要添加/更改什么才能解决此问题?

1 个答案:

答案 0 :(得分:0)

经过一些测试后,我找到了解决方案:

首先,widthForHeight完全没有调用heightForWidth,因此我更改了实现heightForWidth并设置sizePol.setHeightForWidth(True)

第二点是,如果没有足够的空间,网格布局会覆盖首选高度。在我的用例中,我可以将QGLWidget放在QScrollArea中,宽高比是正确的。