Python QWidget.rect的大小不';即使我调整主窗口的大小也不会改变

Python QWidget.rect的大小不';即使我调整主窗口的大小也不会改变,python,python-3.x,pyqt5,qwidget,Python,Python 3.x,Pyqt5,Qwidget,我有一个主窗口,我想在该窗口中应用一些QEvent鼠标事件,如move press。。。等等,我的问题是在我创建了应用程序和主窗口之后,我调整了它的大小,但是当我从QWidget调用rect()函数时,它实际上给了我默认值(0,0,100,30),我希望它给我窗口的大小 class TestTools(unittest.TestCase): app = QApplication([]) main_window = QMainWindow() main_window.res

我有一个主窗口,我想在该窗口中应用一些QEvent鼠标事件,如move press。。。等等,我的问题是在我创建了应用程序和主窗口之后,我调整了它的大小,但是当我从QWidget调用rect()函数时,它实际上给了我默认值(0,0,100,30),我希望它给我窗口的大小

class TestTools(unittest.TestCase):
    app = QApplication([])
    main_window = QMainWindow()
    main_window.resize(958, 584)
    scene = QGraphicsScene()
    canvas = Canvas(scene, main_window)
    print(canvas.rect()) # It Print (0, 0, 100, 30) Whereas it should be (0, 0, 958, 584)
    
    def test():
       pass # There is many functions am using but I don't think it is important to share it
这是帆布课

class Canvas(QGraphicsView):
def __init__(self, scene, centralwidget):
    super().__init__(scene, centralwidget)

    self.scene = scene
    background_color = Qt.white
    self.pixmap_item: QGraphicsItem = self.scene.addPixmap(QPixmap(780, 580))
    self.pixmap_item.setTransformationMode(Qt.FastTransformation)

那么问题出在哪里。

你的假设是基于错误的前提

首先,您只需创建一个具有父级的小部件(QGraphicsView)。这样做只会使小部件成为该父部件的子部件,但没有任何大小限制:小部件只是在其父部件内“浮动”,因此对于新的子部件,其默认大小通常为100x30(对于构造函数中未设置父部件的小部件,其默认大小为640x480)

如果要将子项调整为父项,则必须将其添加到布局中。QMainWindow有自己的(私有)布局管理器,它使用一个中心小部件来显示窗口的“主要”内容,因此如果QGraphicsView将是唯一的小部件,您可以使用
main\u window.setCentralWidget(canvas)
设置它

然后,小部件通常在第一次映射之前不会接收resizeEvent,除非手动调整大小。当它第一次显示时,任何以前未布置的项目都会收到调整大小事件。由于您没有显示主窗口,因此不会发出调整大小事件,但即使在这种情况下,您在添加子窗口之前调整了窗口的大小,因此仍然会看到相同的默认大小

为了确保正确计算布局,即使不显示设置布局的小部件,也必须显式调用布局

因此,总结一下:

  • 小部件必须添加到布局中,以使其大小适应其父级
  • 每当使用QMainWindow时,“主窗口小部件”上必须使用
    setCentralWidget()
  • 在向布局中添加子对象后,应手动调整大小,以确保其几何图形适应父对象(如果执行相反的操作,某些大小策略可能会导致父对象根据子对象自行调整大小)
  • 如果小部件不显示,则必须手动激活布局
类测试工具(unittest.TestCase):
app=QApplication([])
main_window=QMainWindow()
场景=qgraphicscene()
画布=画布(场景,主窗口)
主窗口setCentralWidget(画布)
主窗口。调整大小(958584)
主窗口.布局().激活()
打印(canvas.rect())
请提供一个
class TestTools(unittest.TestCase):
    app = QApplication([])
    main_window = QMainWindow()
    scene = QGraphicsScene()
    canvas = Canvas(scene, main_window)
    main_window.setCentralWidget(canvas)
    main_window.resize(958, 584)
    main_window.layout().activate()
    print(canvas.rect())