QMainWindow только с QDockWidgets и без центрального виджета - PullRequest
18 голосов
/ 20 августа 2010

У нас есть окно с несколькими компонентами в QDockWidget с.В идеале нам бы хотелось, чтобы все компоненты были присоединяемыми, но есть один компонент, который всегда будет виден.Таким образом, мы создали центральный виджет.

Однако это не позволяет нам создавать стек закрепляемых виджетов с вкладками (как вы можете создать, например, вызывая tabifyDockWidget), содержащий этот центральный виджет.Итак, мы попытались создать пользовательский интерфейс без центрального виджета, но с несколькими QDockWidget s.

В руководстве по QDockWidget или QMainWindow я не могу найти никаких указаний на то, что такая ситуацияне допускаетсяМы создаем как можно больше в Qt Designer, и, кажется, требуется, чтобы у вас был центральный виджет - как это показывает сбой после ручного редактирования XML.

Вопрос: законно ли иметь QMainWindow только с QDockWidget с и без центрального виджета?Qt Designer просто вылетает из-за ошибки, или он говорит мне, что это плохая идея, и мне нужно прекратить это делать?

Ответы [ 5 ]

12 голосов
/ 20 августа 2010

В документации Qt сказано, что:

Примечание: Создание главного окна без центрального виджета не поддерживается.У вас должен быть центральный виджет, даже если он просто заполнитель.

Так что вы можете просто скрыть пустой центральный виджет:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->centralWidget->hide();
}
9 голосов
/ 21 октября 2012

Ну, это работает для меня, если я наберу это после сгенерированной строки "ui-> setupUi (this)".

MainWindow::setCentralWidget(NULL);

Если это "legal" Я не знаю, но я знаю этохорошо работает для меня.

(и я знаю, что это старый вопрос, но все еще действует :))

3 голосов
/ 20 октября 2011

Ерунда! У меня есть полностью функциональный QMainWindow только с QDockWidgets и без центрального виджета. Я не знаю, насколько это «законно», но это возможно, если вы создадите его вне QtDesigner, что достаточно просто.

Пример

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_()
1 голос
/ 11 марта 2016

Я столкнулся с этой проблемой с pyside (QT для python).Мне просто нужны были доки, поэтому я должен был создать фальшивый виджет (т. Е. Ярлык), чтобы поместить его в центр.Однако, как только я это скрываю, размеры доков больше не могут быть изменены.То же самое произошло, если я поставил None / null в качестве центрального виджета.

После многих непродуктивных поисков в Интернете я обнаружил, что проблема была в начальной настройке местоположений док-станции (вверху / внизу / слева /право).Если я помещу их все в одну позицию (то есть сверху), чтобы пользователь мог организовать это, проблема не проявляется.Затем я попытался использовать только верхнюю и нижнюю позиции (поскольку я мог организовать доки так, как я хотел, без использования боковых позиций (две сверху и одна снизу). К моему удивлению, при таком расположениипроблема наконец решена.

0 голосов
/ 12 октября 2014

Я столкнулся с той же проблемой, и я надеялся, что уже есть хорошее решение для нее.

Кажется, нет, так что в конце концов я думаю, что я буду использовать MdiArea.

Может быть, вы можете рассмотреть это также?Это работает по-другому, но, может быть, это приятно, достаточно:)

...