QGraphicsView / QGraphicsScene大小匹配

时间:2013-10-17 18:05:09

标签: qt pyqt qgraphicsview qgraphicsscene

如何制作具有指定大小的QGraphicsScene和QGraphicsView来监视具有相同大小的场景?

这听起来像个愚蠢的问题,但请考虑以下测试代码[1]

import sys
from PyQt4 import QtGui, QtCore

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.scene = QtGui.QGraphicsScene(0, 0, 200, 200, self)
        self.view = QtGui.QGraphicsView(self.scene, self)
        #self.view.setMaximumSize(200, 200)
        self.setCentralWidget(self.view)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())

当我运行这个时,我得到了一个带有QGraphicsView的小窗口,没有滚动条。如果我收缩窗口滚动条出现,因为我使视图小于场景的指定大小。如果我放大窗口,条形图会消失,视图会随着窗口调整大小。所有这些都是有道理的。

现在我再次运行相同的代码,但是注释行(前面带有#)未注释。窗口显示在里面,但视图有滚动条。当我缩小窗口时,视图也会缩小,但是当我放大窗口时,视图只会扩大到一定的大小。这并不奇怪。 令人惊讶的是,视图处于最大尺寸时,滚动条仍然存在。我不明白这一点,因为视图的最大大小与代码中场景的大小明确匹配。

为什么会这样?

我知道其他问题已经解释了如何强制场景和视图组合在一起,但我想了解我实际制作的视图和场景大小,因此我尝试使用明确指定的大小。

[1]我正在使用PyQt,C ++用户只需将“self”视为“this”,将“import”视为“#include”

编辑:下面接受的答案是绝对正确的。我想添加其他人阅读此内容,如果您的视图在布局中,您还必须考虑布局边距。这些可以在QtDesigner等中明确设置。

1 个答案:

答案 0 :(得分:5)

好的,我为你工作了!

QGraphicsView(子类QFrame)有一个边框。如果您将以下行添加到 init 方法:

self.view.setFrameShape(QtGui.QFrame.NoFrame)

然后你删除1px帧,它可以正常工作!