如何在PyQt中编辑/添加表单数据?

1 投票
1 回答
1387 浏览
提问于 2025-04-18 01:30

下面的代码,我创建了一个表单,用来放不同的问题,这些问题可以用来选择并添加到一个测试中。我想知道,如何把数据(问题)添加到表单的顶部框里(假设我想添加一个名为'Question'的单个问题),我该怎么做呢?另外,虽然我知道如何把数据(这里指的是文本)添加到底部框,但有没有什么方法可以让我在顶部框中选择一段文本,然后在底部框中查看这段文本或变量的详细信息,而不需要点击任何按钮呢?

代码如下:

import sys, random, time, math, re
from PyQt4 import QtGui, QtCore

class AddTst(QtGui.QWidget):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(464, 409)
        self.verticalLayout_2 = QtGui.QVBoxLayout(Form)
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.listView = QtGui.QListView(Form)
        self.horizontalLayout.addWidget(self.listView)
        self.verticalLayout = QtGui.QVBoxLayout()
        self.EditButton = QtGui.QPushButton(Form)
        self.verticalLayout.addWidget(self.EditButton)
        self.DeleteButton = QtGui.QPushButton(Form)
        self.verticalLayout.addWidget(self.DeleteButton)
        spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem)
        self.AddButton = QtGui.QPushButton(Form)
        self.verticalLayout.addWidget(self.AddButton)
        self.horizontalLayout.addLayout(self.verticalLayout)
        self.verticalLayout_2.addLayout(self.horizontalLayout)
        self.textBrowser = QtGui.QTextBrowser(Form)
        self.verticalLayout_2.addWidget(self.textBrowser)
        self.textBrowser.setPlainText('Hello')

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

    def retranslateUi(self, Form):
        self.EditButton.setText(QtGui.QApplication.translate("Form", "Edit", None, QtGui.QApplication.UnicodeUTF8))
        self.DeleteButton.setText(QtGui.QApplication.translate("Form", "Delete", None, QtGui.QApplication.UnicodeUTF8))
        self.AddButton.setText(QtGui.QApplication.translate("Form", "Add", None, QtGui.QApplication.UnicodeUTF8))

class AddTest(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = AddTst()
        self.ui.setupUi(self)
    def execute_event(self):
        pass
    def execute_all_event(self):
        pass
    def reload_event(self):
        pass

def main():
    app = QtGui.QApplication(sys.argv)
    ex = AddTest()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

1 个回答

1

关于如何将列表项与文本框连接起来的问题,你需要连接一个合适的信号,这样当当前的列表项发生变化时,文本框就会自动填充相应的内容。

不过在处理这个问题之前,还有更重要的事情需要注意。看起来你是用Qt Designer创建了表单,然后用pyuic生成了一个gui模块。但是你犯了一个错误,直接编辑了这个模块。这是个坏主意,因为当你对表单进行更改时,重新生成gui模块时你会失去所有的修改。

正确的做法是将gui模块导入到你的主应用程序中,像这样:

from PyQt4 import QtCore, QtGui
from mainwindow_ui import Ui_MainWindow

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.listWidget.currentRowChanged.connect(self.handleRowChanged)

    def handleRowChanged(self, row):
        item = self.ui.listWidget.item(row)
        # do stuff with list-item...

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

这假设你已经生成了一个叫做mainwindow_ui.py的gui文件,并且你的主应用程序脚本保存在同一个目录下。另外,我使用了QListWidget而不是QListView,使用了QMainWindow而不是QWidget。我建议你也做类似的更改,这样会简化你应用程序的开发。

还有一些其他需要考虑的事情:

  • 你现在使用的是一个文本浏览器来显示内容,但这个控件是只读的。使用QTextEdit可能会更合适。
  • 目前没有办法添加或编辑每个项目的名称/标题。你可以在文本框上方添加一个QLineEdit来实现这个功能。
  • 你的源数据格式是什么?你是如何加载和保存它的?如果你还没有搞清楚这一部分,尽快解决这个问题,因为它可能会对你应用程序的整体设计产生很大影响。

撰写回答