2013-02-10 2 views
2

Как добавить QDockWidget в QFrame? так как у QFrame нет addDockWidget !!!Как добавить QDockWidget в QFrame в PyQt4

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys 

app = QApplication(sys.argv) 

qmainwin = QFrame() 
#qmainwin.setWindowFlags(Qt.FramelessWindowHint) 
s = QWidget() 
vboxlayout = QVBoxLayout() 

spin1 = QSpinBox() 
vboxlayout.addWidget(spin1) 

spin2 = QSpinBox() 
vboxlayout.addWidget(spin2) 
s.setLayout(vboxlayout) 

qdock = QDockWidget() 
qdock.setWindowFlags(Qt.FramelessWindowHint) 
qdock.setWidget(s) 
qmainwin.addDockWidget(Qt.TopDockWidgetArea, qdock) 
qmainwin.show() 

app.exec_() 
+0

Есть ли какая-либо конкретная причина для использования 'QFrame' вместо' QMainWindow'? – Avaris

+1

Я сделал приложение GUI, используя 'QFrame', и все сработало хорошо позже, я обнаружил необходимость какой-то отделяемой части графического интерфейса, теперь, когда у меня слишком много макетов, я хотел посмотреть, есть ли у них быстрый способ сделать это. –

+1

Было бы относительно легко преобразовать 'QFrame' в' QMainWindow'. По крайней мере, гораздо проще, чем переносить прикрепляемые виджеты на QFrame. – Avaris

ответ

1

Как насчет этого? Я добавил QDockWidget в QLayout, а затем установил макет QFrame.

import sys 
from PyQt4 import QtGui, QtCore 

class Example(QtGui.QWidget): 

    def __init__(self): 
     super(Example, self).__init__() 

     self.initUI() 

    def initUI(self): 

     frame = QtGui.QFrame() 
     frame.setFrameStyle(QtGui.QFrame.Panel | 
       QtGui.QFrame.Plain) 

     label = QtGui.QLabel('This is random text') 

     dockWidget = QtGui.QDockWidget('Main', self) 
     # set the widget to non-movable, non-floatable and non-closable 
     dockWidget.setFeatures(dockWidget.NoDockWidgetFeatures) 
     dockWidget.setWidget(label) 

     # add the QDockWidget to the QLayout 
     hbox = QtGui.QHBoxLayout() 
     hbox.addWidget(dockWidget) 

     # set the layout of the QFrame 
     frame.setLayout(hbox) 

     # create another QLayout to add QFrame 
     vbox = QtGui.QVBoxLayout() 
     vbox.addStretch(1) 
     vbox.addWidget(frame) 

     self.setLayout(vbox) 

     self.setGeometry(300, 300, 500, 400) 
     self.setWindowTitle('Test') 

def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+2

это аккуратно, спасибо !!! есть ли способ отключить кнопку закрытия док-виджета? –

+0

Единственный способ, которым я знаю, как это сделать, - установить функции «QDockWidget» на «NoDockWidgetFeatures» и, следовательно, на неплавкие, не движимые и не закрываемые. Это кажется логичным, поскольку, если вы можете отсоединить виджет док-станции из своего окна, вы также можете закрыть его. Я обновил свой ответ, поэтому взгляните. –

+0

, который убирает точку с плавающим окном, тогда мы не сможем использовать 'QtCore.Qt.FramelessWindowHint', как это возможно в' QFrame'? –

Смежные вопросы