gpt4 book ai didi

python - 需要 PyQt 和 QGridLayout 的一些帮助

转载 作者:行者123 更新时间:2023-12-01 06:17:09 25 4
gpt4 key购买 nike

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

我有一个 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))

有人能看出我做错了什么吗?

最佳答案

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

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

解决了!

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

为了使正确的布局发挥作用并为您提供所需的表单布局,您必须将您的 ui 项目作为“MainWindow”应用程序启动。不是带有按钮的对话框或小部件应用程序。 MainWindow 模板配备了一个“centralWidget”,从而为您提供了布局选项。因此,如果您没有这样做,下面将帮助您改变这一点

看起来 pyuic4 在这一方面确实有所不足。为整体 ui 提供一个包装器以 Hook 到主窗口的一种方法是通过将所有小部件设置为整体布局来最终确定它们。 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")
....
....

现在在普通模块中您将调用此 UIobjects.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_())

关于python - 需要 PyQt 和 QGridLayout 的一些帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2676369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com