使用相同模型更新两个不同 类 中的 tableView

Update tableView in two different classes with same model

我有两个不同的 class 并且想分享相同的 model/database。因此,如果我在 model/database 中创建新记录,则不同 classes 中的 tableView 应该更新。现在只有和insert同一个class里面的tableView更新了。拜托我需要你的帮忙。谢谢

我的代码:

import sys
from PySide import QtCore, QtGui, QtSql

from model import Model

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.initUI()

        self.createNewDatabase()

        self.openEditor()

    def initUI(self):
        self.tableView = QtGui.QTableView(self)
        self.tableView.resize(self.tableView.sizeHint())
        button = QtGui.QPushButton('make Entry', self)
        button.clicked.connect(self.insertEntry)

        self.setGeometry(400, 400, 300, 300)
        self.show()

    def createConnection(self, databasePath):
        # Create a QSQLite database
        self.database = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        # Set path of the database
        self.database.setDatabaseName(databasePath)

        self.database.open()

    def initializeModel(self):
        self.model = Model()
        self.model.setTable("friends")
        self.model.select()

    def createNewDatabase(self):

        databasePath = QtGui.QFileDialog.getSaveFileName(self, 'Save database...', '')[0]
        self.createConnection(databasePath)
        self.createRelationalTables()
        self.initializeModel()

        # Set the model for MainWindow table view
        self.tableView.setModel(self.model)

    def createRelationalTables(self):

        sqlQuery = QtSql.QSqlQuery()
        sqlQuery.exec_(
                '''
                CREATE TABLE friends(
                    id INTEGER PRIMARY KEY NOT NULL,
                    name TEXT NOT NULL,
                    name2 TEXT NOT NULL)
                '''
        )

    def insertEntry(self):
        # Get number of rows of database
        row = self.model.rowCount()
        # Create an empty record
        record = QtSql.QSqlRecord()
        # Insert record
        self.model.insertRecord(-1, record)

    def openEditor(self):
        # Create an instance of Editor
        self.editor = Editor()
        # Show the editor
        self.editor.show()

class Editor(QtGui.QWidget):
    def __init__(self, parent=None):

        QtGui.QWidget.__init__(self)

        self.initUI()

        # Set the model for the table view of Editor
        self.model = Model()
        self.model.setTable("friends")
        self.model.select()
        self.tableView.setModel(self.model)

    def initUI(self):
        self.tableView = QtGui.QTableView(self)
        self.tableView.resize(self.tableView.sizeHint())

        self.setGeometry(400, 400, 300, 300)
        self.show()

def main():

    app = QtGui.QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

模特:

from PySide.QtSql import *
from PySide.QtCore import *

class Model(QSqlRelationalTableModel):
    def __init__(self):
        super(Model, self).__init__()

    def setData(self, index, value, role = Qt.EditRole):

        if role == Qt.EditRole:
            self._items[index.row()] = str(value.toString().toUtf8())
            QObject.emit(self, SIGNAL("dataChanged(const QModelIndex&, const QModelIndex &)"), index, index)
            return True
        return False

您正在创建两个模型,一个在 MainWindow,一个在 Editor。您有两个 class Model 的实例,但您只更新了一个。

你想要的是只创建一次模型,并在多个视图中使用它。第一个模型和编辑器都在MainWindow中实例化了,所以初始化编辑器的时候只需要传入模型即可:

def openEditor(self):
      self.editor = Editor(self.model)
      self.editor.show()

class Editor(QtGui.QWidget):
    def __init__(self, model, parent=None):
        QtGui.QWidget.__init__(self)
        self.tableView = QtGui.QTableView(self)
        self.tableView.setModel(model)