2013-08-23 69 views
1

我已經設置了簡單的例子使用PyQt設計器。見下文。 我有mdiarea在其中我添加一個窗體作爲子窗口。我使窗體比mainwindow稍微長一些,以查看子窗口是否出現滾動條。Python PyQt/PySide QMdiArea子窗口滾動不工作在TabbedView

問題: 如果我設置mdiarea到setViewMode(QtGui.QMdiArea.TabbedView)滾動條停止工作,消失。 Howeevr如果我不使用TabbedView,滾動條工作正常。 誰能告訴我什麼是錯的?我需要帶有工作滾動條的mdiarea的TabbedView。

我在win7上使用Python 2.7,PyQT 4.8.4/PySide 1.2.1。

Python示例代碼: 註釋行self.mdiArea.setViewMode查看示例工作。

import sys 
from PyQt4 import QtCore, QtGui 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(500, 400) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget) 
     self.verticalLayout.setObjectName("verticalLayout") 
     self.mdiArea = QtGui.QMdiArea(self.centralwidget) 
     self.mdiArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) 
     self.mdiArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) 
     self.mdiArea.setActivationOrder(QtGui.QMdiArea.CreationOrder) 
     self.mdiArea.setViewMode(QtGui.QMdiArea.TabbedView) 
     self.mdiArea.setTabsClosable(True) 
     self.mdiArea.setTabsMovable(True) 
     self.mdiArea.setObjectName("mdiArea") 
     self.verticalLayout.addWidget(self.mdiArea) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 508, 21)) 
     self.menubar.setObjectName("menubar") 
     self.menuAdd = QtGui.QMenu(self.menubar) 
     self.menuAdd.setObjectName("menuAdd") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 
     self.menubar.addAction(self.menuAdd.menuAction()) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle( "MainWindow") 
     self.menuAdd.setTitle("&Add Form") 

class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName(("Form")) 
     Form.resize(400, 800) 
     self.gridLayout = QtGui.QGridLayout(Form) 
     self.gridLayout.setObjectName(("gridLayout")) 
     self.plainTextEdit = QtGui.QPlainTextEdit(Form) 
     self.plainTextEdit.setMinimumSize(QtCore.QSize(0, 731)) 
     self.plainTextEdit.setObjectName(("plainTextEdit")) 
     self.gridLayout.addWidget(self.plainTextEdit, 0, 0, 1, 1) 
     self.buttonBox = QtGui.QDialogButtonBox(Form) 
     self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) 
     self.buttonBox.setObjectName(("buttonBox")) 
     self.gridLayout.addWidget(self.buttonBox, 1, 0, 1, 1) 

     self.retranslateUi(Form) 
     QtCore.QMetaObject.connectSlotsByName(Form) 

    def retranslateUi(self, Form): 
     Form.setWindowTitle("Lengthy subwindow") 
     self.plainTextEdit.setPlainText("Lengthy Form") 


class MyApp(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MyApp, self).__init__(parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

    def Add_Subwindow(self): 
     widget = QtGui.QWidget() 
     self.subwin_abq = Ui_Form() 
     self.subwin_abq.setupUi(widget) 
     self.subwindow = QtGui.QMdiSubWindow(self.ui.mdiArea) 
     widget.setParent(self.subwindow) 
     self.subwindow.setWidget(widget) 
     self.subwindow.setWindowTitle("testing") 
     self.ui.mdiArea.addSubWindow(self.subwindow) 
     widget.show() 
     self.subwindow.show() 
     self.subwindow.widget().show() 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    window = MyApp() 
    window.show() 
    window.Add_Subwindow() 
    sys.exit(app.exec_()) 

回答

0

只是想說感謝OP中的代碼 - 正在PyQT中尋找一個簡單的MDI示例,而你的幫助我很多!我沒有完全答案,但這是我迄今可以注意到的:我有Python 2.7,PyQT 4.8.3,並且只是在評論setTabsClosablesetTabsMovable行時,我可以讓您的示例顯示如下:

qt1 qt2

我下載designer-qt4,看着那裏大約QMdiArea,似乎也沒有什麼所謂的TabbedView。所以,我發現這一點:

QtWidgets 5.0: QMdiArea Class | Documentation | Qt Project

枚舉VIEWMODE {SubWindowView,TabbedView}
這個枚舉變量描述了區域的視圖模式;即如何顯示子窗口。
SubWindowView 0顯示帶窗口框架的子窗口(默認)。
TabbedView 1在標籤欄中顯示帶有選項卡的子窗口。
documentMode:該屬性保持選項卡欄是否在選項卡式視圖模式下設置爲文檔模式。

我看這個問題的方法:要麼你,以顯示MDI時尚的子窗口(這樣它們可以比窗口大,帶有滾動條)的子窗口成爲標籤視圖選項卡 - 和那裏的子窗口的大小已經無關緊要,因此它會擴展以佔用可用的選項卡區域。此外,在您的代碼中,self.ui.mdiArea.documentMode()在兩種情況下均返回False

我還你MyApp.Add_Subwindow()的末尾添加這段代碼:

sp = self.subwindow.sizePolicy() 
    print sp.__dict__ 
    #print dir(sp) 
    for attr in dir(sp): 
     try: 
     print "obj.%s = %s" % (attr, getattr(sp, attr)) 
     except: pass 

這轉儲一些有趣的數據(我不知道如果這些是對象的屬性,雖然):

obj.ButtonBox = 2 
obj.CheckBox = 4 
obj.ComboBox = 8 
obj.ControlType = <class 'PyQt4.QtGui.ControlType'> 
obj.ControlTypes = <class 'PyQt4.QtGui.ControlTypes'> 
obj.DefaultType = 1 
obj.ExpandFlag = 2 
obj.Expanding = 7 
obj.Fixed = 0 
obj.Frame = 16 
... 

。 ..但是這些在運行選項卡式和MDI模式時不會改變。

那麼,也許這是預期的行爲?如果是這樣,那意味着你必須找到像「孤獨」選項卡顯示小部件的東西;以編程方式添加幾個QMdiAreas;在開始時隱藏所有這些,但默認的一個;然後在各個選項卡上綁定點擊以顯示「其」QMdiArea並隱藏其他(但不用說,我沒有測試過)。