pyqt: стыковка со стороны сложенных qdockwidgets

мультидок

Я сделал окно с несколькими доками. Для этого я спрятал центральный виджет, и он у меня появился. Но у меня есть проблема (или, может быть, еще что-то?). Если виджеты док-станции расположены друг над другом, я не могу закрепить один из них сбоку. Как видно из рисунка выше, мне просто нужно состыковаться между доками. Как я могу настроить его? Вот и весь мой код.

from PyQt4 import QtCore, QtGui

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)        
        self.resize(800, 600)
        self.setWindowTitle(QtGui.QApplication.translate("self", "self", None, QtGui.QApplication.UnicodeUTF8))
        self.setDockOptions(QtGui.QMainWindow.AnimatedDocks)
        self.centralwidget = QtGui.QWidget(self)
        self.centralwidget.hide()
        self.setCentralWidget(self.centralwidget)        
        self.menubar = QtGui.QMenuBar(self)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(self)
        self.setStatusBar(self.statusbar)
        self.dock1Widget = QtGui.QDockWidget(self)
        self.dock1Widget.setFeatures(QtGui.QDockWidget.AllDockWidgetFeatures)
        self.dock1Widget.setWindowTitle(QtGui.QApplication.translate("self", "dock1", None, QtGui.QApplication.UnicodeUTF8))
        self.dock1WidgetContents = QtGui.QWidget()
        self.dock1Widget.setWidget(self.dock1WidgetContents)
        self.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dock1Widget)
        self.dock2Widget = QtGui.QDockWidget(self)
        self.dock2Widget.setFeatures(QtGui.QDockWidget.AllDockWidgetFeatures)
        self.dock2Widget.setWindowTitle(QtGui.QApplication.translate("self", "dock2", None, QtGui.QApplication.UnicodeUTF8))
        self.dock2WidgetContents = QtGui.QWidget()
        self.dock2Widget.setWidget(self.dock2WidgetContents)
        self.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dock2Widget)
        self.dock3Widget = QtGui.QDockWidget(self)
        self.dock3Widget.setFeatures(QtGui.QDockWidget.AllDockWidgetFeatures)
        self.dock3Widget.setWindowTitle(QtGui.QApplication.translate("self", "dock3", None, QtGui.QApplication.UnicodeUTF8))
        self.dock3WidgetContents = QtGui.QWidget()
        self.dock3Widget.setWidget(self.dock3WidgetContents)
        self.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dock3Widget)
        self.dock4Widget = QtGui.QDockWidget(self)
        self.dock4Widget.setFeatures(QtGui.QDockWidget.AllDockWidgetFeatures)
        self.dock4Widget.setWindowTitle(QtGui.QApplication.translate("self", "dock4", None, QtGui.QApplication.UnicodeUTF8))
        self.dock4WidgetContents = QtGui.QWidget()
        self.dock4Widget.setWidget(self.dock4WidgetContents)
        self.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dock4Widget)

if __name__ == '__main__':

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

person Hyun-geun Kim    schedule 31.10.2012    source источник


Ответы (1)


Без centralWidget один dockWidgetArea может полностью расшириться и сделать все остальные области доков недоступными.

Одним из возможных решений является использование вложенных доков (AllowNestedDocks). Это позволит вам более свободно размещать виджеты в док-станции. Это не совсем то же поведение, но, возможно, более гибкое. Установите параметры стыковки следующим образом:

self.setDockOptions(QtGui.QMainWindow.AnimatedDocks | QtGui.QMainWindow.AllowNestedDocks)

Кстати, если вам не нужен центральный виджет, вы можете просто не устанавливать его. Значение по умолчанию — NULL, и это имеет тот же эффект, что и установка фиктивного виджета и его скрытие.

person Avaris    schedule 31.10.2012
comment
Спасибо за ваш совет. Как вы рекомендовали, я переписал свой код :) - person Hyun-geun Kim; 31.10.2012