需要PyQt和QGridLayout的一些帮助

时间:2010-04-20 15:24:29

标签: python pyqt designer qt-designer

我在这里遇到了一个令人讨厌的顽固问题,如果有人能让我对我做错了什么有所了解,我将不胜感激。

我有一个PyQt应用程序,应该显示一个数字表。所以,当然,我正在使用QTableWidget。现在,它非常简单:我所做的就是创建一个带有桌面小部件和按钮的窗口并显示它。我还没有填表。

我希望表能够使用窗口自动调整大小,最终我要在此窗体中添加其他窗口小部件,因此我使用的是QGridLayout。当我在Qt Designer中预览表单时,它的外观和行为都正确。除了按钮使用的空间外,Table占用了所有表单,当我调整窗口大小时,它们都会正确调整大小。但是当我尝试运行生成的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))

任何人都可以看到我可能做错了吗?

2 个答案:

答案 0 :(得分: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_()

答案 1 :(得分:1)

我也想知道这个问题的答案。

“它必须在你的设置中”是零帮助。

解决!

附录:以下任务和声明是合法的。但是,如果您已将对话框/ UI创建为对话框和/或窗口小部件,则它们适用。这本身就是探针所在的地方

要使正确的布局正常工作并为您提供所需的表单布局,您必须将您的ui项目作为“MainWindow”应用程序启动。不是带按钮或Widget应用程序的对话框。 MainWindow模板准备了“centralWidget”,从而为您提供布局选项。所以,如果你没有,下面将帮助你改变

看来pyuic4在这一方面不足。为整个ui提供一个挂钩到主窗口的包装器的方法是通过将它们设置为整体布局来最终确定所有小部件。 QGridLayout,QVerticalLayout,没关系,只是为了让UI的所有内容都由顶层布局“处理”。不要将布局应用于表单。

注意:您可能希望暂时只能使用QT Designer中的“预览”。然而,这是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_())