关于 qt4:QMainWindow 只有 QDockWidgets 而没有中央小部件

QMainWindow with only QDockWidgets and no central widget

我们在 QDockWidget 中有一个包含多个组件的窗口。理想情况下,我们希望所有组件都可停靠,但有一个组件可能始终可见。所以我们把它作为中心小部件。

但是,这不允许我们创建包含此中央小部件的可停靠小部件的选项卡式堆栈(您可以通过例如调用 tabifyDockWidget 创建)。因此,我们尝试创建一个没有中央小部件但有几个 QDockWidgets.

的 UI

我在QDockWidgetQMainWindow 的手册中找不到任何指示这是不允许的情况。我们在 Qt Designer 中尽可能多地创建,它似乎需要您有一个中央小部件 - 正如手动编辑 XML 后崩溃所显示的那样。

问题是:拥有一个只有 QDockWidget 并且没有中央小部件的 QMainWindow 是否合法? Qt Designer 只是因为错误而崩溃,还是告诉我这是一个坏主意,我需要停止这样做?


Qt 的文档说:

Note: Creating a main window without a
central widget is not supported. You
must have a central widget even if it
is just a placeholder.

所以你可以隐藏空的中央小部件:

1
2
3
4
5
6
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->centralWidget->hide();
}


如果我在"ui->setupUi(this)"生成的行之后键入它,它对我有用。

1
MainWindow::setCentralWidget(NULL);

如果是 "legal" 我不知道,但我知道它对我很有效。

(我知道这是一个老问题,但仍然有效:))


胡说八道!我有一个功能齐全的 QMainWindow,只有 QDockWidgets 而没有中央小部件。我不知道它有多"合法",但如果您在 QtDesigner 之外创建它,这很容易。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from PyQt4 import QtCore, QtGui

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setWindowTitle('Dock Widgets')
        self.setTabPosition( QtCore.Qt.TopDockWidgetArea , QtGui.QTabWidget.North )
        self.setDockOptions( QtGui.QMainWindow.ForceTabbedDocks )

        self.dockList = []
        for dockName in 'First Second Third Fourth'.split():
            dock = QtGui.QDockWidget(dockName)
            dock.setWidget(QtGui.QListWidget())
            dock.setAllowedAreas(QtCore.Qt.TopDockWidgetArea)
            self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock)

            self.dockList.append( dock )


        if len(self.dockList) > 1:
            for index in range(0, len(self.dockList) - 1):
                self.tabifyDockWidget(self.dockList[index],self.dockList[index + 1])



if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    app.exec_()

我在 pyside(python 的 QT)中遇到了这个问题。我只需要码头,所以我必须创建一个假小部件(即标签)作为中心。但是,一旦我隐藏它,码头就不能再自由调整大小了。如果我将 None/null 作为中心小部件,也会发生同样的情况。

在互联网上进行了大量无效搜索后,我发现问题出在码头位置的初始设置(上/下/左/右)。如果我把它们都放在同一个位置(即顶部)让用户组织它,问题就不会出现。然后我尝试只使用顶部和底部位置(因为我可以按照我想要的方式组织码头而不使用横向位置(顶部两个,底部一个)。令我惊讶的是,这种安排问题终于解决了。


我也遇到过同样的问题,我希望已经有一些不错的解决方案。

似乎没有,所以最终我想我会使用 MdiArea。

也许你也可以考虑一下?它以不同的方式工作,但也许它很好:)