如何在没有中心窗口的应用程序中设置QDockWidget的初始(默认)大小(PyQt4)?

7
我有一个应用程序,有很多 QDockWidgets ,没有中央窗口。 我想设置其中一些 QDockWidgets 的初始大小(应用程序启动时的大小),但我不想限制它们的最小/最大大小。

如何做到这一点? 例如,我需要将其中一个的初始大小设置为150x75。 我尝试了显而易见的方法(例如与 dock widget 内容相关的 QWidget.Resize() ),但根本没有起作用。

这是情况的简化模型:

from PyQt4 import QtCore, QtGui

app = QtGui.QApplication([''])

mw = QtGui.QMainWindow() # mw = MainWindow
mw.setCentralWidget(None)
mw.showMaximized()

mw.dockWdg1 = QtGui.QDockWidget(mw)
mw.content1 = QtGui.QTreeWidget()
mw.dockWdg1.setWidget(mw.content1)
mw.addDockWidget(QtCore.Qt.DockWidgetArea(2), mw.dockWdg1)
mw.dockWdg1.setWindowTitle("1st dock widget")

mw.dockWdg2 = QtGui.QDockWidget(mw)
mw.content2 = QtGui.QTreeWidget()
mw.dockWdg2.setWidget(mw.content2)
mw.addDockWidget(QtCore.Qt.DockWidgetArea(1), mw.dockWdg2)
mw.dockWdg2.setWindowTitle("2nd dock widget")

mw.dockWdg3 = QtGui.QDockWidget(mw)
mw.content3 = QtGui.QTreeWidget()
mw.dockWdg3.setWidget(mw.content3)
mw.addDockWidget(QtCore.Qt.DockWidgetArea(1), mw.dockWdg3)
mw.dockWdg3.setWindowTitle("3rd dock widget")

mw.show()
app.exec_()

1
QMainWindow 必须始终具有中央小部件,但您可以尝试将其大小设置为0。 - alexisdm
@alexisdm,那怎么做呢?你能否发一些代码帮助我吗?谢谢! - Bruno Gelb
例如,使用 mw.setCentralQWidget(QWidget())mw.centralWidget().setFixedSize(0,0)这个问题展示了在没有设置中央窗口部件时可能遇到的问题。 - alexisdm
4个回答

11

停靠窗口将被合并到主窗口的布局中,因此任何尝试调整它们的大小都将被忽略。

解决此问题的标准方法是创建内容窗口的子类并重新实现其sizeHint

class TreeWidget(QtGui.QTreeWidget):
    def sizeHint(self):
        return QtCore.QSize(150, 75)

mw.dockWdg2 = QtGui.QDockWidget(mw)
mw.content2 = TreeWidget()
mw.dockWdg2.setWidget(mw.content2)

然而,这只有在您仔细管理其他 dockwidgets 的大小的同时,才能发挥作用。当然,最大化主窗口也会对最终结果产生影响。

您可能还想考虑使用 QMainWindow.saveStateQMainWindow.restoreState 来管理 dockwidgets 的初始状态。


1
使用fixedSize函数,就像setFixedWidth/setFixedHeight一样。

这个包含了将小部件设置为确切大小的代码;原始发布者只想要默认大小,而不是设置最小和最大尺寸。 - RolKau

0

我认为基于MainWindow的大小重新实现sizeHint()函数比仅返回固定大小更好。

源代码

// size hint
QSize RenderWindow::sizeHint() const
{
    float width = MainWindow::instance()->width() * 0.3f;
    float height = MainWindow::instance()->height() * 0.65f;
    return QSize( width, height);
}

enter image description here


0

如果有人在Qt 5.6之后看到了这个旧问题,应该查看QMainWindow :: resizeDocks()

https://doc.qt.io/qt-5/qmainwindow.html#resizeDocks

例如:

mw.resizeDocks({ mw.dockWdg1,  mw.dockWdg1 }, { 260, 540 }, Qt.Vertical);

(不确定这是否是100%有效的Python代码,但你明白我的意思…)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接