2010-04-20 136 views
1

我在這裏有一個令人討厭的頑固問題,我會很感激,如果有人可以給我一些洞察我做錯了什麼。需要一些幫助PyQt和QGridLayout

我有一個PyQt應用程序應該顯示一個數字表。所以,自然,我正在使用QTableWidget。現在,這非常簡單:我所做的只是創建一個帶有表格控件和按鈕的窗口並顯示它。我還沒有填充表格。

我希望表格能夠自動調整窗口大小,並最終我將添加其他窗口小部件到這個表單,所以我使用QGridLayout。當我在Qt Designer中預覽窗體時,它的外觀和行爲都是正確的。表格佔用了除按鈕使用的空間以外的所有表單,當我調整窗口大小時,它們都會隨着它調整大小。但是當我嘗試運行生成的Python代碼時,它全部搞砸了。表格窗口小部件和按鈕都在窗口的左上角互相重疊在一起。

我使用Qt Designer 4創建了.ui文件,並使用pyuic4生成了Python代碼。我根本沒有手動編輯任何一個文件。所以我假設兩者都沒有基本的語法錯誤。我的猜測是,我在某種程度上誤解了窗口小部件,窗口和佈局管理器之間的關係。但我無法弄清楚如何。

這裏是我的.ui文件的代碼:

<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>TableWindow</class> 
<widget class="QWidget" name="TableWindow"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>586</width> 
    <height>383</height> 
    </rect> 
    </property> 
    <property name="sizePolicy"> 
    <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> 
    <horstretch>0</horstretch> 
    <verstretch>0</verstretch> 
    </sizepolicy> 
    </property> 
    <property name="windowTitle"> 
    <string/> 
    </property> 
    <layout class="QGridLayout" name="gridLayout"> 
    <item row="0" column="0"> 
    <widget class="QTableWidget" name="tableWidget"/> 
    </item> 
    <item row="1" column="0"> 
    <widget class="QPushButton" name="btnSave"> 
    <property name="text"> 
     <string>Save to File</string> 
    </property> 
    </widget> 
    </item> 
    </layout> 
</widget> 
<resources/> 
<connections/> 
</ui> 

這裏是pyuic4從的.ui文件生成的Python代碼:

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 
'ui_table_window.ui' 
# 
# Created: Mon Apr 19 23:47:43 2010 
#  by: PyQt4 UI code generator 4.6 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt4 import QtCore, QtGui 

class Ui_TableWindow(object): 
    def setupUi(self, TableWindow): 
     TableWindow.setObjectName("TableWindow") 
     TableWindow.resize(586, 383) 
     sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, 
               QtGui.QSizePolicy.Expanding) 
     sizePolicy.setHorizontalStretch(0) 
     sizePolicy.setVerticalStretch(0) 

sizePolicy.setHeightForWidth(TableWindow.sizePolicy().hasHeightForWidth()) 
     TableWindow.setSizePolicy(sizePolicy) 
     self.gridLayout = QtGui.QGridLayout(TableWindow) 
     self.gridLayout.setObjectName("gridLayout") 
     self.tableWidget = QtGui.QTableWidget(TableWindow) 
     self.tableWidget.setObjectName("tableWidget") 
     self.tableWidget.setColumnCount(0) 
     self.tableWidget.setRowCount(0) 
     self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 1) 
     self.btnSave = QtGui.QPushButton(TableWindow) 
     self.btnSave.setObjectName("btnSave") 
     self.gridLayout.addWidget(self.btnSave, 1, 0, 1, 1) 

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

    def retranslateUi(self, TableWindow): 
     self.btnSave.setText(QtGui.QApplication.translate("TableWindow", "Save to File", None, QtGui.QApplication.UnicodeUTF8)) 

任何人都可以看到我可能是做錯了?

回答

1

我想知道這個問題的答案也。

「它必須在你的設置」是零幫助。

已解決!

附錄:下面的任務和陳述是合法的。但是,如果您將對話/用戶界面創建爲對話框和/或窗口小部件,則它們適用。這本身就是probelem所在的位置

爲了正確的佈局工作併爲您提供所需的表單佈局,您必須將您的ui項目作爲「MainWindow」應用程序啓動。不是帶按鈕或小工具應用程序的對話框。 MainWindow模板使用「centralWidget」準備,因此提供了佈局選項。所以,如果你沒有,下面將幫助你改變這一點

它似乎在這一方面缺乏pyuic4。一種讓所有用戶界面都可以掛鉤到主窗口的方法是通過將所有小部件設置爲全部佈局來完成所有小部件。 QGridLayout,QVerticalLayout,沒關係,只是爲了讓UI的所有內容都由頂層佈局「處理」。不要將佈局應用於表單。

注意:您可能只想暫時只能在QT設計器中使用「預覽」。然而,這是py轉換被破壞的地方。您需要在保存/轉換前打破/刪除表格的佈局

一旦保存。UI文件,並使用pyuic4轉換爲你的.py文件,你需要在正常的模塊添加/更改一兩行

from PyQt4 import QtCore, QtGui 

class Ui_Dialog(object): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName("Dialog") 
     Dialog.resize(625, 448) 

       <create a "holder" central widget> 
     self.widget = QtGui.QWidget() 

       <set the overall QLayout with the widget as the> 
       <parent rather than the "Dialog" that the> 
       <generated code gives you> 
     self.gridLayout_2 = QtGui.QGridLayout(self.widget) 

     self.gridLayout_2.setObjectName("gridLayout_2") 
     .... 
     .... 

現在你會打電話給這個UI objects.setCentralWidget()函數來設置該部件

if __name__ == "__main__": 
     app = QtGui.QApplication(sys.argv) 
     myapp = MyForm() 
     < set the widget inside the form to it's cetral widget > 
     myapp.setCentralWidget(myapp.ui.widget) 

     myapp.show() 
     sys.argv[1] = myapp.unUNCPath(sys.argv[1]) 
     os.chdir(sys.argv[1]) 
     myapp.setRootDir(sys.argv[1]) 
     myapp.processDirectory() 
     sys.exit(app.exec_()) 
1

你有什麼完美的作品,所以它必須在你的設置。以下應該適合你:

from PyQt4 import QtCore, QtGui 
from Ui_TableWindow import Ui_TableWindow # adjust accordingly 

class TableWindow(QtGui.QWidget, Ui_TableWindow): 
    def __init__(self, parent): 
     QtGui.QWidget.__init__(self, parent) 
     self.setupUi(self) 

if __name__ == '__main__': 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = TableWindow(None) 
    window.show() 
    app.exec_()