1

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

我有一个应该显示数字表的 PyQt 应用程序。所以,很自然,我使用的是 QTableWidget。现在,它非常简单:我所做的就是创建一个带有 Table Widget 和一个按钮的窗口并显示它。我还没有填充表格。

我希望表格能够随窗口自动调整大小,最终我将向此表单添加其他小部件,因此我使用的是 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))

谁能看到我可能做错了什么?

4

2 回答 2

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_()
于 2010-04-20T15:56:42.820 回答
1

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

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

解决了!

附录:下面的任务和陈述是合法的。但是,如果您已将对话框/UI 创建为对话框和/或小部件,则它们适用。这本身就是问题所在

为了使正确的布局工作并为您提供所需的表单布局,您必须将您的 ui 项目作为“MainWindow”应用程序启动。不是带有按钮的对话框或小部件应用程序。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_())
于 2010-08-26T00:30:51.487 回答