使用相同模型更新两个不同 类 中的 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)
我有两个不同的 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)