【问题标题】:QGraphicsView / QGraphicsScene size matchingQGraphicsView / QGraphicsScene 大小匹配
【发布时间】:2013-10-26 08:58:25
【问题描述】:

如何制作一个具有指定大小的 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 等中显式设置。

【问题讨论】:

  • 我知道的不够多,无法回答这个问题,但是如果您取消注释该行并将数字更改为 202(而不是 200),您就不会看到滚动条。据推测,Qt 正在计算 200px 方形 GraphicsScene 不太适合 200px 方形 GraphicsView。也许 GraphicsView 有一个 1px 的边框?

标签: qt pyqt qgraphicsview qgraphicsscene


【解决方案1】:

好的,我帮你解决了!

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

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

然后您删除 1px 框架,它会按预期工作!

【讨论】:

    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2011-06-26
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多