如何解决即使我调整主窗口的大小,QWidget.rect 的大小也不会改变
我有一个主窗口,我想在该窗口中应用一些 QEvent 鼠标事件,例如移动按下...等,我的问题是在创建应用程序和主窗口后我调整了它的大小,但是当我调用来自 QWidget 的 rect() 函数实际上给了我默认值 (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,30) Whereas it should be (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_window.setCentralWidget(canvas)
进行设置。
然后,除非手动调整大小,否则小部件通常在第一次映射之前不会收到 resizeEvent。当它第一次显示时,任何先前未布局的项目都会收到调整大小事件。由于您没有显示主窗口,因此不会发出任何调整大小事件,但即使在这种情况下,您也在添加子窗口之前调整了窗口大小,因此您仍会看到相同的默认大小。 >
为了确保即使没有显示设置布局的小部件也能正确计算布局,必须显式调用 activate()
。
总结一下:
- 小部件必须添加到布局中才能使其大小适应其父级;
- 每当使用 QMainWindow 时,
setCentralWidget()
必须在“主窗口小部件”上使用; - 手动调整大小应该在 将子项添加到布局之后进行,以确保它们的几何形状适应父项(如果您反其道而行,某些大小策略可能会导致父项自身基于在孩子身上);
- 如果不显示小部件,则必须手动激活布局;
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())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。