qt - 更改数据库时 pyqt QTableView 不填充 [英] qt - pyqt QTableView not populating when changing databases
问题描述
我试图让我的用户选择要打开的数据库.每个数据库将具有相同的架构.出于某种原因,虽然我无法在打开数据库后填充 QTableView.
I'm trying to allow my users to pick which database to open. Each database will have the same schema. For some reason though I can't get my QTableView to populate after I open the database.
我正在解释示例代码,但这应该能让您了解我正在尝试做什么.
I'm paraphrasing the example code but this should give you an idea of what I'm trying to do.
作品:
class aMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.db = QSqlDatabase.addDatabase("QSQLITE")
self.db.setDatabaseName('testdb.db')
self.db.open()
# Set up the user interface from Designer.
self.setupUi(self)
#self.db.setDatabaseName('testdb.db')
self.model = QSqlTableModel(self)
self.model.setTable("records")
self.model.setSort(FILEORDER, Qt.AscendingOrder)
self.model.setHeaderData(ID, Qt.Horizontal, QVariant("ID"))
self.model.setHeaderData(FILEORDER, Qt.Horizontal, QVariant("File Order"))
self.model.setHeaderData(RECORDTYPE, Qt.Horizontal, QVariant("Type"))
self.model.setHeaderData(NAME, Qt.Horizontal, QVariant("Name"))
self.model.setHeaderData(PRESORTNAME, Qt.Horizontal, QVariant("Presort Name"))
self.model.setHeaderData(RECORD, Qt.Horizontal, QVariant("Record"))
self.model.select()
self.tableView.setModel(self.model)
#self.view.setSelectionMode(QTableView.SingleSelection)
#self.view.setSelectionBehavior(QTableView.SelectRows)
self.tableView.setColumnHidden(ID, True)
self.tableView.setColumnHidden(PRESORTNAME, True)
self.tableView.setColumnHidden(RECORD, True)
不起作用:
class aMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
QMainWindow.__init__(self)
# Set up the user interface from Designer.
self.setupUi(self)
#self.db.setDatabaseName('testdb.db')
self.model = QSqlTableModel(self)
self.model.setTable("records")
self.model.setSort(FILEORDER, Qt.AscendingOrder)
self.model.setHeaderData(ID, Qt.Horizontal, QVariant("ID"))
self.model.setHeaderData(FILEORDER, Qt.Horizontal, QVariant("File Order"))
self.model.setHeaderData(RECORDTYPE, Qt.Horizontal, QVariant("Type"))
self.model.setHeaderData(NAME, Qt.Horizontal, QVariant("Name"))
self.model.setHeaderData(PRESORTNAME, Qt.Horizontal, QVariant("Presort Name"))
self.model.setHeaderData(RECORD, Qt.Horizontal, QVariant("Record"))
self.model.select()
self.tableView.setModel(self.model)
#self.view.setSelectionMode(QTableView.SingleSelection)
#self.view.setSelectionBehavior(QTableView.SelectRows)
self.tableView.setColumnHidden(ID, True)
self.tableView.setColumnHidden(PRESORTNAME, True)
self.tableView.setColumnHidden(RECORD, True)
#slot of the open db action
def on_actionOpen_DB_triggered(self, checked=None):
if checked is None: return
filename = QFileDialog.getOpenFileName(self, 'open a database',
'/home/',
"Databases (*.db)", #All Files (*.*)
"Databases (*.db)")
if not filename:
pass
self.db = QSqlDatabase.addDatabase("QSQLITE")
if self.db.isOpen():
sys.stdout.write('db still open?')
self.db.setDatabaseName(filename)
self.dbname = filename
self.db.open()
self.model.select()
#self.tableView.update()
if self.db.isOpen():
sys.stdout.write('db opened')
推荐答案
今天我不记得我在哪里找到它了,但是当我在研究其他东西时,我发现一些论坛帖子说必须在进行连接之前建立连接模型.我怀疑模型构造中必须有一些代码接触数据库.建立连接后,我更改了 on_actionOpen_DB_triggered 以创建模型,并且效果很好.
I can't remember today exactly where I found it but as I was researching something else I found some forum posting that said the connection must be made before making the model. I suspect there must be some code in the model construct that's touching the db. I changed my on_actionOpen_DB_triggered to create the model after making the connection and it works just fine.
这篇关于qt - 更改数据库时 pyqt QTableView 不填充的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!