Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QGraphicsView与预期大小不同_Python_Qt_Pyqt_Qgraphicsview_Qtabwidget - Fatal编程技术网

Python QGraphicsView与预期大小不同

Python QGraphicsView与预期大小不同,python,qt,pyqt,qgraphicsview,qtabwidget,Python,Qt,Pyqt,Qgraphicsview,Qtabwidget,我通过Qt Designer创建了两个选项卡,每个选项卡都包含一个QGraphicsView。 默认情况下选择tab2时,两个选项卡的大小与预期相同。但是,当默认选择tab1时,它们之间的大小不同(没有原因?!)。 有什么建议吗 先谢谢你 编辑(提供示例代码及其输出): 一种可能性是,这是Qt仅按需实例化选项卡的方式的结果。所以,当启动时选择tab 1时,tab 2还不存在。如果启动时选择了tab 2,我不知道tab 1是否已经存在(因为它是默认选项卡)。如果确实如此,则当启动时选项卡2处于选择

我通过Qt Designer创建了两个选项卡,每个选项卡都包含一个QGraphicsView。 默认情况下选择tab2时,两个选项卡的大小与预期相同。但是,当默认选择tab1时,它们之间的大小不同(没有原因?!)。 有什么建议吗

先谢谢你

编辑(提供示例代码及其输出):


一种可能性是,这是Qt仅按需实例化选项卡的方式的结果。所以,当启动时选择tab 1时,tab 2还不存在。如果启动时选择了tab 2,我不知道tab 1是否已经存在(因为它是默认选项卡)。如果确实如此,则当启动时选项卡2处于选择状态时,Qt从两个选项卡都有大小信息,但如果启动时选项卡1处于选择状态,则Qt仅具有选项卡1的大小信息

您可以尝试实例化所有选项卡,这篇pyqt文章讨论了相关的问题和修复

更新:

我测试了您的代码,并确认即使在PyQt5中也存在相同的行为。对于尚未选择的选项卡,构建后的尺寸是错误的。但是,一旦选择了选项卡,它就会展开,其大小也就正确了。要查看这一点,请注释掉self.tabWidget.setCurrentIndex(0)行并更改这3行

    print self.graphicsView.size()
    print self.graphicsView_2.size()
    print self.graphicsView_3.size()
为此(缩进很重要:我将3条print语句移动到一个新的
printViewSizes
方法,并添加了一个选项卡更改观察者):

并添加以下两种方法:

def printViewSizes(self):
    print(self.graphicsView.size())
    print(self.graphicsView_2.size())
    print(self.graphicsView_3.size())

def onTabChange(self):
    print('Tab changed')
    self.printViewSizes()
现在,在窗口可见后,单击选项卡2,然后单击选项卡3。输出为:

PyQt5.QtCore.QSize(640, 480)
PyQt5.QtCore.QSize(640, 480)
PyQt5.QtCore.QSize(640, 480)
PyQt5.QtCore.QSize(622, 462)
PyQt5.QtCore.QSize(100, 30)
PyQt5.QtCore.QSize(100, 30)
Tab changed
PyQt5.QtCore.QSize(758, 518)
PyQt5.QtCore.QSize(758, 518)
PyQt5.QtCore.QSize(100, 30)
Tab changed
PyQt5.QtCore.QSize(758, 518)
PyQt5.QtCore.QSize(758, 518)
PyQt5.QtCore.QSize(758, 518)

显示选项卡2的大小在可见时立即正确,然后选项卡3的大小在可见时立即正确。因此,如果您在选项卡中遇到布局问题,这不是问题所在,很可能是在图形视图中的小部件的调整大小处理程序中

是的,这与此有关。我不明白这个链接的解决方案。但是,我将CurrentIndex设置为最后一个选项卡(因此所有选项卡都已加载),然后将其设置回第一个选项卡(不会卸载其他选项卡)。@intergallactic极好。我希望你能接受并投票给我这个答案,否则我将不胜感激。不幸的是,我在加载最后一个标签和第一个标签时所做的技巧不起作用。但关键是你提到的,qt按需实例化。@intergallactic明白了。你可以发布一个极简主义的例子吗?我相信如果我们可以尝试一些代码,我们可以找出一些问题,因为这通常不是一个问题,所以在选项卡或选项卡视图父项中放置的代码有一些特定的问题。我编辑了问题,现在包括代码和输出结果。
    self.tabWidget.currentChanged.connect(self.onTabChange)
    self.printViewSizes()
def printViewSizes(self):
    print(self.graphicsView.size())
    print(self.graphicsView_2.size())
    print(self.graphicsView_3.size())

def onTabChange(self):
    print('Tab changed')
    self.printViewSizes()
PyQt5.QtCore.QSize(640, 480)
PyQt5.QtCore.QSize(640, 480)
PyQt5.QtCore.QSize(640, 480)
PyQt5.QtCore.QSize(622, 462)
PyQt5.QtCore.QSize(100, 30)
PyQt5.QtCore.QSize(100, 30)
Tab changed
PyQt5.QtCore.QSize(758, 518)
PyQt5.QtCore.QSize(758, 518)
PyQt5.QtCore.QSize(100, 30)
Tab changed
PyQt5.QtCore.QSize(758, 518)
PyQt5.QtCore.QSize(758, 518)
PyQt5.QtCore.QSize(758, 518)