QMainWindow只有QDockWidgets,没有中央小部件

时间:2010-08-20 13:01:59

标签: qt4 pyqt4

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

但是,这不允许我们创建包含此中央窗口小部件的可停靠窗口小部件的标签式堆栈(您可以创建,例如调用tabifyDockWidget)。因此,我们尝试创建一个没有中央窗口小部件的UI,但是有几个QDockWidget s。

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

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

5 个答案:

答案 0 :(得分:12)

Qt's documentation说:

  

注意:创建一个没有的主窗口   中央小部件不受支持。您   即使它必须有一个中央小部件   只是一个占位符。

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->centralWidget->hide();
}

答案 1 :(得分:9)

如果我在“ui-gt; setupUi(this)”生成的行之后键入它,那么它对我有用。

MainWindow::setCentralWidget(NULL);

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

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

答案 2 :(得分:3)

无意义!我有一个功能齐全的QMainWindow,只有QDockWidgets,没有中央小部件。我不知道它是多么“合法”,但如果你在QtDesigner之外创建它很容易,那就是deffinatley。这很容易。

实施例

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_()

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

我遇到了同样的问题,我希望已经有一些很好的解决方案。

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

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