Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过单击按钮在QTableView中追加数据?_Python_Pyqt4_Qtableview - Fatal编程技术网

Python 如何通过单击按钮在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

我正在使用QTableView显示数据库中的内容。该程序有两个QLineEdits:self.nameSlot和self.amountSlot。我还有《今日自我》,这是一本QdateEdit。当我使用self.applyButton将新数据插入数据库时,它会根据需要工作,但数据不会附加到QTableView。我该如何解决这个问题?这是我的密码

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)