qt - pyqt QTableView在更改数据库时未填充

1 投票
1 回答
3073 浏览
提问于 2025-04-15 15:35

我正在尝试让我的用户选择要打开哪个数据库。每个数据库的结构都是一样的。不过,不知道为什么我打开数据库后,QTableView却没有显示任何内容。

我在这里稍微改写了一下示例代码,但这应该能让你明白我想做的事情。

能正常工作的代码:

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')

1 个回答

2

我今天记不清楚具体在哪儿看到的,但在我研究其他东西的时候,发现了一个论坛帖子,上面说在创建模型之前必须先建立连接。我猜模型的构造过程中可能有一些代码在操作数据库。我把我的 on_actionOpen_DB_triggered 这个函数改成在建立连接之后再创建模型,结果一切都正常了。

撰写回答