如何向已创建的表单添加数据?PyQt/Python/SQL

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

我创建了一个基本的表单布局,使用了分割器、QListWidget和QTextBrowser。我想知道如何将数据从SQL数据库导入到ListWidget框中(或者简单地添加一些文本,比如字符串)。另外,当用户点击ListWidget框中的某个数据时,如何在TextBrowser框中详细显示该数据的扩展信息呢?还有,我该如何固定分割器,让用户无法移动或调整分割器呢?

代码如下:

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

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.grouplist = QtGui.QListWidget()
        self.messageList = QtGui.QListWidget()
        self.MessageView = QtGui.QTextBrowser()
        self.messageSplitter = QtGui.QSplitter(QtCore.Qt.Vertical)
        self.messageSplitter.addWidget(self.messageList)
        self.messageSplitter.addWidget(self.MessageView)
        self.mainSplitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
        self.mainSplitter.addWidget(self.grouplist)
        self.mainSplitter.addWidget(self.messageSplitter)
        self.setCentralWidget(self.mainSplitter)


        self.mainSplitter.setStretchFactor(0, 1)
        self.mainSplitter.setStretchFactor(1, 3)
        self.messageSplitter.setStretchFactor(0 ,1)
        self.messageSplitter.setStretchFactor(1, 2)
    def closeEvent(self, event):
        if self.okToContinue():
            settings = QtGui.QSettings()
            settings.setValue("MainWindow/Size", QVariant(self.size()))
            settings.setValue("MainWindow/Position", QVariant(self.pos()))
            settings.setValue("MainWindow/State", QVariant(self.saveState()))
            settings.setValue("MessageSplitter", QVariant(self.messageSplitter.saveState()))
            settings.setValue("MainSplitter", QVariant(self.manSplitter.saveState()))
        else:
            event.ignore()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

1 个回答

1

你需要的是 QSqlTableModel,另外要用 ListView 而不是 ListWidget。简单来说,就是把数据库文件加载到这个模型里,然后把模型连接到 ListView。接着,在 listView 中设置你想要显示的模型列,使用 setModelColumn() 这个函数。

下面是一个你可以这样做的例子。

from PyQt4 import QtCore, QtGui,QtSql
import os

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s
CONFIG_DATABASE_PATH = "./"
CONFIG_DATABASE_NAME = "comboboxexample.db"

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(640, 480)
        filename = os.path.join(CONFIG_DATABASE_PATH,CONFIG_DATABASE_NAME)
        self.db = QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName(filename)
        self.model = QtSql.QSqlTableModel(self, self.db)
        self.model.setTable('items') # enter the table name
        self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
        self.splitter = QtGui.QSplitter(Form)
        self.splitter.setGeometry(QtCore.QRect(10, 30, 621, 441))
        self.splitter.setOrientation(QtCore.Qt.Horizontal)
        self.splitter.setObjectName(_fromUtf8("splitter"))
        self.listView = QtGui.QListView(self.splitter)
        self.listView.setObjectName(_fromUtf8("listView"))
        self.listView.setModel(self.model)

        # enter the column number which you want to display
        self.listView.setModelColumn(1)

        self.textEdit = QtGui.QTextEdit(self.splitter)
        self.textEdit.setObjectName(_fromUtf8("textEdit"))

        self.retranslateUi(Form)
        QtCore.QObject.connect(self.listView, QtCore.SIGNAL("clicked(QModelIndex)"),self.ListClicked_2)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))

    def ListClicked_2( self, qmodelindex ):
        # then take the data from the model and display it in the textEdit
        self.textEdit.setText(qmodelindex.data(QtCore.Qt.DisplayRole).toString())

撰写回答