删除所有 DockWidget 后如何调整 QMainWindow 的大小?

发布于 2024-11-29 07:11:05 字数 974 浏览 2 评论 0原文

我正在尝试制作一个由 QMainWindow 组成的应用程序,其中央小部件是 QToolBar (它可能不常见,但就我的目的而言,工具栏非常适合)。仅允许在下面使用码头。我向其中添加了一个 QDockWidgetQToolBar 上的 QAction 使用 打开和关闭 QDockWidget >removeDockWidget()restoreDockWidget()

QMainWindow 的默认大小是 800 x 24,QToolBarmaximumHeight 也设置为 24。调用 removeDockWidget() 后,QMainWindow 的几何形状通过 setGeometry 设置回 (0,0,800,24) ()

我想要实现的是当DockWidget被删除时将QMainWindow的高度调整为24。 setGeometry() 似乎可以工作,因为宽度和位置会相应变化,但有趣的是,高度没有变化。这确实是我的问题:)

你觉得怎么回事?

这是一个屏幕截图,说明了当前的问题。

注意:如果我使用 QWidget 而不是 QMainWindow 创建相同的场景,并在子部件上使用 show()hide() ,那么我可以调整父部件的大小使用 adjustSize() 没有问题:上面的问题似乎是 QMainWindow 特定的。

I’m trying to make an application consisting of a QMainWindow, the central widget of which is a QToolBar (it may not be usual, but for my purpose the toolbar’s well suited). Docks are allowed below only. I added a QDockWidget to it, and a QAction on the QToolBar toggles the QDockWidget on and off with removeDockWidget() and restoreDockWidget().

The default size of the QMainWindow is 800 by 24, QToolBar’s maximumHeight is set to 24 too. Right after the removeDockWidget() is called, QMainWindow’s geometry is set back to (0,0,800,24) with setGeometry().

What I want to achieve is to resize the QMainWindow’s height to 24 when the DockWidget’s removed. The setGeometry() seems to work since width and position change accordingly, but funnily enough, the height doesn’t budge. And that’s my problem really :)

What’s the matter you think?

Here is a screen-cast illustrating the issue at hand.

NB: if i create the same scenario using a QWidget rather than QMainWindow, and using a show() or hide() on the child widget, then I can resize the parent with adjustSize() without problem: it seems the problem here above is QMainWindow specific.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

挽清梦 2024-12-06 07:11:05

选项

a) 您可以重载 sizeHint() 虚拟函数。让它返回您想要的主窗口大小。

b) 在主窗口的构造函数中,您可以依次调用 setMinimumSize() 和 setMaximumSize(),两者都具有所需的主窗口大小。如果你保持两者相同,你就会得到固定的大小。

c) 看一下layout()->setResizeMode(Fixed)。

Options

a) You can overload sizeHint() a virtual function. Let it return the size you want for your main window.

b) In the main window's constructor you can call setMinimumSize() and setMaximumSize() one after another, both with the the desired main window size. If you keep both same you get a fixed size.

c) Take a look at layout()->setResizeMode(Fixed).

深空失忆 2024-12-06 07:11:05

看来您误解了 QMainWindow.sizeHint() 方法的含义。

根据 QWidget.sizeHint() 文档 (QMainWindow 从中继承):

此属性保存小部件的推荐大小

如果此属性的值是无效大小,则不建议使用任何大小。
如果此小部件没有布局,则 sizeHint() 的默认实现将返回无效大小,否则返回布局的首选大小。

要获取窗口的实际大小,您应该使用 QMainWindow.geometry() 方法,该方法提供有关小部件大小和位置的所有信息:

win_geo = self.geometry()
win_top = win_geo.top()
win_bottom = win_geo.bottom()
win_left = win_geo.left()
win_right = win_geo.right()
win_width = win_geo.width()
win_height = win_geo.height()

It looks like you misunderstood the meaning of the QMainWindow.sizeHint() method.

According to QWidget.sizeHint() documentation (from which QMainWindow inherits):

This property holds the recommended size for the widget.

If the value of this property is an invalid size, no size is recommended.
The default implementation of sizeHint() returns an invalid size if there is no layout for this widget, and returns the layout's preferred size otherwise.

To get the actual size of your window, you should use the QMainWindow.geometry() method instead, which gives all the informations about the widget size and position:

win_geo = self.geometry()
win_top = win_geo.top()
win_bottom = win_geo.bottom()
win_left = win_geo.left()
win_right = win_geo.right()
win_width = win_geo.width()
win_height = win_geo.height()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文