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

时间:2015-07-16 12:25:01

标签: python pyqt pyside

我有两个不同的类,想要共享相同的模型/数据库。因此,如果我对模型/数据库创建新记录,则不同类中的tableViews应该更新。现在只更新与insert相同的类中的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

1 个答案:

答案 0 :(得分:0)

您正在创建两个模型,一个在MainWindow,一个在Editor。您有两个类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)