问题描述
我正在尝试制作一个表格来查看数据库,作为更大项目的一部分。整个项目使用了很多数据库和连接,所以我必须使用自定义连接名称来管理它们。
问题是,尽管数据库正在打开并且文件似乎正确生成,但我无法在 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)
main.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")
此更改后,表生成正常。