微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PyQt 和 QtSql 数据库 - 自定义连接和 QSqlTableModel

如何解决PyQt 和 QtSql 数据库 - 自定义连接和 QSqlTableModel

我正在尝试制作一个表格来查看数据库,作为更大项目的一部分。整个项目使用了很多数据库和连接,所以我必须使用自定义连接名称来管理它们。

问题是,尽管数据库正在打开并且文件似乎正确生成,但我无法在 QsqlTableModel 表中查看它,文档没有太大帮助。

这里是脚本:

database.py

from PyQt5.QtWidgets import QMessageBox
from PyQt5.Qtsql import QsqlDatabase,QsqlQuery
from PyQt5 import Qtsql


def createConnection():
    """Create and open a database connection."""
    connection = Qtsql.QsqlDatabase.addDatabase("QsqlITE","conkon")
    connection.setDatabaseName("contacts.sqlite")
    query = Qtsql.QsqlQuery(connection)
    if connection.open():
        query.exec(
           """
           CREATE TABLE IF NOT EXISTS contacts (
               short VARCHAR(40) NOT NULL,fullname VARCHAR(50) NOT NULL,NIP VARCHAR(50),postcode VARCHAR(50) NOT NULL,city VARCHAR(50) NOT NULL,street VARCHAR(50) NOT NULL,phone VARCHAR(50),email VARCHAR(40),discount INTEGER,comment VARCHAR(40)
           )
           """
       )

model.py

from PyQt5.QtCore import Qt
from PyQt5.Qtsql import QsqlTableModel
from PyQt5 import QtWidgets,Qtsql

class ContactsModel():
    def __init__(self):
        self.model = self._createModel()

    @staticmethod
    def _createModel():
        tableModel = Qtsql.QsqlTableModel(None,Qtsql.QsqlDatabase.database("contacts.sqlite"))
        tableModel.setTable("contacts")
        tableModel.setEditStrategy(QsqlTableModel.OnFieldChange)
        tableModel.select()
        headers = ("Skrót","Pełna Nazwa","NIP","Kod pocztowy","Miejscowość","Ulica","Telefon","Email","Rabat","Komentarz" )
        for columnIndex,header in enumerate(headers):
            tableModel.setHeaderData(columnIndex,Qt.Horizontal,header)
            return tableModel

窗口声明表单views.py的片段

    """Main Window."""

    def __init__(self):
        """Initializer."""
        super().__init__()
        self.setwindowTitle("MOJManager")
        self.resize(1000,250)
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        self.layout = QHBoxLayout()
        self.centralWidget.setLayout(self.layout)
        self.contactsModel = ContactsModel()
        self.setupUI()

   def setupUI(self):
        """Setup the main window's GUI."""
        # Create the table view widget
        self.table = QTableView()
        self.table.setModel(self.contactsModel.model)
        self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.table.resizeColumnsToContents()
        # Create buttons
        self.addButton = QPushButton("Dodaj")
        self.addButton.clicked.connect(self.openAddDialog)
        self.deleteButton = QPushButton("Usuń")
        self.deleteButton.clicked.connect(self.deleteContact)
        self.clearallButton = QPushButton("Wyczyść wszystko")
        self.clearallButton.clicked.connect(self.clearContacts)
        # Lay out the GUI
        layout = QVBoxLayout()
        layout.addWidget(self.addButton)
        layout.addWidget(self.deleteButton)
        layout.addStretch()
        layout.addWidget(self.clearallButton)
        self.layout.addWidget(self.table)
        self.layout.addLayout(layout)

ma​​in.py


import sys

from PyQt5.QtWidgets import QApplication

from .database import createConnection
from .views import WindowKontakty


def mainKont():
    """RP Contacts main function."""
    app = QApplication(sys.argv)
   # Connect to the database before creating any window
    createConnection()
    # Create the main window if the connection succeeded
    winMag = WindowKontakty()
    winMag.show()
    sys.exit(app.exec_())
    return winMag

问题是,任何地方都没有显示错误(,数据库似乎已打开。我无法从表视图中填充它,只能使用查询。我看到问题可能与此数据库连接有关,但我找不到在哪里。谁能帮忙找出来?

编辑:我在 views.py 上添加了带有 setModel() 的代码片段

解决方法

问题解决了,它在于 tableModel.setTable("contacts")方法,它应该通过连接而不是数据库名称来寻址。改成

时就醒了

tableModel.setTable("conkon")

此更改后,表生成正常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。