繁体   English   中英

如何简单地更新 PyQt GUI 中的表?

[英]How to simply update a Table in a PyQt GUI?

我想用 Qt-Designer 创建我的 GUI 的基本外观,然后通过编码添加功能。 也许已经存在问题,但让我们 go 更进一步。

我通过 Qt 设计器创建的 GUI 由一个 4x4 表和一个按钮组成。 当按下按钮时,我想在表格的单元格中写一些东西。

(当然,这在不使用 Qt 设计器的情况下尤其可行。但是对于未来,我想创建一些更难的 GUI。因此 Qt 设计器确实为像我这样的新手节省了很多时间:))

图形界面代码是:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(686, 539)
        self.widget = QtWidgets.QWidget(Form)
        self.widget.setGeometry(QtCore.QRect(10, 60, 258, 223))
        self.widget.setObjectName("widget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tableWidget = QtWidgets.QTableWidget(self.widget)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(4)
        self.tableWidget.setRowCount(4)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(3, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(3, item)
        self.verticalLayout.addWidget(self.tableWidget)
        self.pushButton = QtWidgets.QPushButton(self.widget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        self.pushButton.clicked.connect(say_hello)

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

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        item = self.tableWidget.verticalHeaderItem(0)
        item.setText(_translate("Form", "1"))
        item = self.tableWidget.verticalHeaderItem(1)
        item.setText(_translate("Form", "2"))
        item = self.tableWidget.verticalHeaderItem(2)
        item.setText(_translate("Form", "3"))
        item = self.tableWidget.verticalHeaderItem(3)
        item.setText(_translate("Form", "4"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("Form", "A"))
        item = self.tableWidget.horizontalHeaderItem(1)
        item.setText(_translate("Form", "B"))
        item = self.tableWidget.horizontalHeaderItem(2)
        item.setText(_translate("Form", "C"))
        item = self.tableWidget.horizontalHeaderItem(3)
        item.setText(_translate("Form", "D"))
        testitem=QtWidgets.QTableWidgetItem()
        self.tableWidget.setItem(1, 0, testitem)
        self.pushButton.setText(_translate("Form", "PushButton"))
        self.pushButton.clicked.connect(say_hello(testitem))

def say_hello(testitem):
    print("Hello you!")
    testitem.setText("Hi")

GUI 从另一个文件中调用,如下所示:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication
import sys
import GUI_PyQtn

class ExampleApp(QtWidgets.QWidget, GUI_PyQtn.Ui_Form):
    def __init__(self, parent=None):
        super(ExampleApp, self).__init__(parent)
        self.setupUi(self)


def main():

    app = QApplication(sys.argv)
    form = ExampleApp()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

我对我的方法的想法是,创建 Cell object 并将其传递给 function“say_hello”。 如果 function 会在 Ui_Form Class 中,它甚至不会调用它一次。

我相信您可以通过以下调整获得您想要的东西。

  • 在 class Ui_Form 中用 self 声明 testitem

  • 在 class Ui_Form 声明 say_hello

  • 通过 lambda 在 say_hello 中传递 testitem

  • 在 retranslateUi 中不使用 click.connect()

就是这样

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(686, 539)
        self.widget = QtWidgets.QWidget(Form)
        self.widget.setGeometry(QtCore.QRect(10, 60, 258, 223))
        self.widget.setObjectName("widget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tableWidget = QtWidgets.QTableWidget(self.widget)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(4)
        self.tableWidget.setRowCount(4)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(3, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(3, item)
        self.verticalLayout.addWidget(self.tableWidget)
        self.pushButton = QtWidgets.QPushButton(self.widget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        # declare testitem with self ih here
        self.testitem=QtWidgets.QTableWidgetItem()
        # pass testitem in say_hello
        self.pushButton.clicked.connect(lambda: self.say_hello(self.testitem))

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

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        item = self.tableWidget.verticalHeaderItem(0)
        item.setText(_translate("Form", "1"))
        item = self.tableWidget.verticalHeaderItem(1)
        item.setText(_translate("Form", "2"))
        item = self.tableWidget.verticalHeaderItem(2)
        item.setText(_translate("Form", "3"))
        item = self.tableWidget.verticalHeaderItem(3)
        item.setText(_translate("Form", "4"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("Form", "A"))
        item = self.tableWidget.horizontalHeaderItem(1)
        item.setText(_translate("Form", "B"))
        item = self.tableWidget.horizontalHeaderItem(2)
        item.setText(_translate("Form", "C"))
        item = self.tableWidget.horizontalHeaderItem(3)
        item.setText(_translate("Form", "D"))
        #self.testitem=QtWidgets.QTableWidgetItem()
        self.tableWidget.setItem(1, 0, self.testitem)
        #self.pushButton.setText(_translate("Form", "PushButton"))
        #self.pushButton.clicked.connect(self.say_hello(testitem))

    # say_hello in class
    def say_hello(self, testitem):
        testitem.setText('Hi')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM