2015-07-16 4 views
0

У меня есть два разных класса и вы хотите использовать одну и ту же модель/базу данных. Поэтому, если я создаю новую запись для модели/базы данных, tableViews в разных классах должны обновляться. Теперь обновляется только таблицаView в том же классе, что и вставка. Пожалуйста, мне нужна твоя помощь. Благодарю.Обновить таблицуView в двух разных классах с одинаковой моделью

Мой код:

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 

ответ

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)