7

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

怎么做?例如,我需要将初始大小 150x75 设置为其中之一。我尝试了明显的方法(例如与停靠小部件内容相关的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_()
4

3 回答 3

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)

但是,这仅在您还仔细管理其他 dockwidget 的大小时才有效。当然,最大化主窗口也会对最终结果产生影响。

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

于 2012-12-05T03:35:47.933 回答
1

使用 fixedSize 函数,如 setFixedWidth/setFixedHeight。

于 2013-05-06T20:38:50.393 回答
0

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

源代码

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

在此处输入图像描述

于 2018-08-22T09:22:20.560 回答