如何向已创建的表单添加数据?PyQt/Python/SQL
我创建了一个基本的表单布局,使用了分割器、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())