Python 如何通过单击按钮在QTableView中追加数据?
我正在使用QTableView显示数据库中的内容。该程序有两个QLineEdits:self.nameSlot和self.amountSlot。我还有《今日自我》,这是一本QdateEdit。当我使用self.applyButton将新数据插入数据库时,它会根据需要工作,但数据不会附加到QTableView。我该如何解决这个问题?这是我的密码Python 如何通过单击按钮在QTableView中追加数据?,python,pyqt4,qtableview,Python,Pyqt4,Qtableview,我正在使用QTableView显示数据库中的内容。该程序有两个QLineEdits:self.nameSlot和self.amountSlot。我还有《今日自我》,这是一本QdateEdit。当我使用self.applyButton将新数据插入数据库时,它会根据需要工作,但数据不会附加到QTableView。我该如何解决这个问题?这是我的密码 import sys from PyQt4 import QtGui, QtCore, QtSql from Printer import PrintVi
import sys
from PyQt4 import QtGui, QtCore, QtSql
from Printer import PrintView
from database import DatabaseInfo
import Sky2
class Sky(QtGui.QMainWindow, Sky2.Ui_MainWindow):
def __init__(self):
QtGui.QWidget.__init__(self)
self.setupUi(self)
self.database = DatabaseInfo()
self.database.setup()
self.applyButton.clicked.connect(self.new_client)
self.toDay.setMinimumDate(QtCore.QDate.currentDate())
self.toDay.setMaximumDate(QtCore.QDate.currentDate())
self.tableView.resizeColumnsToContents()
self.tableView.horizontalHeader().setVisible(True)
self.tableView.setShowGrid(False)
self.tableView.setSortingEnabled(True)
# failed to use sort
# self.tableView.sortByColumn(self, 2, QtCore.Qt.SortOrder(0))
database = QtSql.QSqlDatabase.addDatabase('QSQLITE')
database.setDatabaseName('database.db')
database.open()
self.table_model = QtSql.QSqlQueryModel()
self.table_model.setQuery("SELECT * FROM Clients ")
self.tableView.setModel(self.table_model)
self.table_model.setHeaderData(0, QtCore.Qt.Horizontal, "Name")
self.table_model.setHeaderData(1, QtCore.Qt.Horizontal, "Amount")
self.table_model.setHeaderData(2, QtCore.Qt.Horizontal, "Date")
def new_client(self):
name = self.nameSlot.text()
amount = self.amountSlot.text()
date = self.toDay.text()
self.database.add_client(name, amount, date)
self.table_model.layoutChanged.emit()
self.tableView.setModel(self.table_model)
# print('success')
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_P:
self.printing()
def printing(self):
printer = QtGui.QPrinter(QtGui.QPrinter.ScreenResolution)
dialog = QtGui.QPrintPreviewDialog(printer)
view = PrintView()
view.setModel(self.tableView.model())
dialog.paintRequested.connect(view.print_)
dialog.exec_()
def main():
app = QtGui.QApplication(sys.argv)
gui = Sky()
gui.show()
app.exec_()
if __name__ == '__main__':
main()
QSqlQueryModel不会收到更改通知,因此如果您想获得新信息,必须通过setQuery请求
如果您要使用一个表,您可以以一种简单且可选的方式使用QSqlTableModel,并且您可以通过QSqlRecord和insertRecord方法添加元素,使用此方法,模型会得到通知,因为顺序是由模型完成的
class Sky(QtGui.QMainWindow, Sky2.Ui_MainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi(self)
self.applyButton.clicked.connect(self.new_client)
self.toDay.setMinimumDate(QtCore.QDate.currentDate())
self.toDay.setMaximumDate(QtCore.QDate.currentDate())
self.tableView.resizeColumnsToContents()
self.tableView.horizontalHeader().setVisible(True)
self.tableView.setShowGrid(False)
self.tableView.setSortingEnabled(True)
# failed to use sort
# self.tableView.sortByColumn(self, 2, QtCore.Qt.SortOrder(0))
self.database = QtSql.QSqlDatabase.addDatabase('QSQLITE')
self.database.setDatabaseName('database.db')
if not self.database.open():
self.close()
self.table_model = QtSql.QSqlTableModel()
self.table_model.setTable("Clients")
self.table_model.select()
self.tableView.setModel(self.table_model)
self.table_model.setHeaderData(0, QtCore.Qt.Horizontal, "Name")
self.table_model.setHeaderData(1, QtCore.Qt.Horizontal, "Amount")
self.table_model.setHeaderData(2, QtCore.Qt.Horizontal, "Date")
def new_client(self):
name = self.nameSlot.text()
amount = self.amountSlot.text()
date = self.toDay.text()
record = self.table_model.record()
record.setValue("Name", name)
record.setValue("Amount", amount)
record.setValue("Date", date)
self.table_model.insertRecord(self.table_model.rowCount(), record)
谢谢成功了。我知道我错过了一些小东西
class Sky(QtGui.QMainWindow, Sky2.Ui_MainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi(self)
self.applyButton.clicked.connect(self.new_client)
self.toDay.setMinimumDate(QtCore.QDate.currentDate())
self.toDay.setMaximumDate(QtCore.QDate.currentDate())
self.tableView.resizeColumnsToContents()
self.tableView.horizontalHeader().setVisible(True)
self.tableView.setShowGrid(False)
self.tableView.setSortingEnabled(True)
# failed to use sort
# self.tableView.sortByColumn(self, 2, QtCore.Qt.SortOrder(0))
self.database = QtSql.QSqlDatabase.addDatabase('QSQLITE')
self.database.setDatabaseName('database.db')
if not self.database.open():
self.close()
self.table_model = QtSql.QSqlTableModel()
self.table_model.setTable("Clients")
self.table_model.select()
self.tableView.setModel(self.table_model)
self.table_model.setHeaderData(0, QtCore.Qt.Horizontal, "Name")
self.table_model.setHeaderData(1, QtCore.Qt.Horizontal, "Amount")
self.table_model.setHeaderData(2, QtCore.Qt.Horizontal, "Date")
def new_client(self):
name = self.nameSlot.text()
amount = self.amountSlot.text()
date = self.toDay.text()
record = self.table_model.record()
record.setValue("Name", name)
record.setValue("Amount", amount)
record.setValue("Date", date)
self.table_model.insertRecord(self.table_model.rowCount(), record)