问题描述
self.table = QTableView()
self.model = QsqlRelationalTableModel(self)
self.model.setTable('main')
self.model.setEditStrategy(QsqlTableModel.OnFieldChange)
self.model.setRelation(1,QsqlRelation("Names","nameOfCm","nameOfCm"))
self.model.setRelation(2,QsqlRelation("Types","type_IDs","typeOfCm"))
self.model.setRelation(8,QsqlRelation("Places","placeName","placeName"))
self.model.select()
self.table.setModel(self.model)
self.table.setItemDelegate(QsqlRelationalDelegate(self.table))
通过使用 QsqlRelationalDelegate,我在表的某些列中有组合框。
第 1 列是一些电子元件(如晶体管或 IC 等)的名称。
第 2 列是该电子元件的类型(例如,对于晶体管,我有 PNP、NPN 等。对于 IC,我有运算放大器、微型等)。
当我单击“类型”列中的组合框时,无论我在组合框“名称”列中选择什么,它都会显示所有类型的电子元件。 我想以这样的方式过滤这些项目,只在组合框“类型”中显示与组合框“名称”相关的项目。
例如,如果我从“名称”中选择晶体管,组合框“类型”将显示:NPN、PNP。如果我选择 IC,组合框“类型”显示:Micro、Op_Amp。
这是简化的代码:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
from PyQt5.Qtsql import *
connectDB = QsqlDatabase.addDatabase("QsqlITE")
connectDB.setDatabaseName('test.db')
connectDB.open()
query = QsqlQuery()
createNaMetable='CREATE TABLE IF NOT EXISTS "Names" ("nameOfCm" TEXT,PRIMARY KEY("nameOfCm"))'
createTypeTable='CREATE TABLE IF NOT EXISTS "Types" ("type_IDs" TEXT,"typeOfCm" TEXT,PRIMARY KEY("type_IDs"))'
createMainTable='CREATE TABLE IF NOT EXISTS "main" ("partnumber" TEXT,"name" TEXT,"type" TEXT,PRIMARY KEY("partnumber"))'
query.exec(createNaMetable)
query.exec(createTypeTable)
query.exec(createMainTable)
query.exec("INSERT INTO Names (nameOfCm) VALUEs ('IC')")
query.exec("INSERT INTO Names (nameOfCm) VALUEs ('Transistor')")
query.exec("INSERT INTO Types (type_IDs,typeOfCm) VALUEs ('Transistor1','NPN')")
query.exec("INSERT INTO Types (type_IDs,typeOfCm) VALUEs ('Transistor2','PNP')")
query.exec("INSERT INTO Types (type_IDs,typeOfCm) VALUEs ('IC1','Op_AMP')")
query.exec("INSERT INTO Types (type_IDs,typeOfCm) VALUEs ('IC2','Micro')")
class main (QMainWindow):
def __init__(self):
super(main,self).__init__()
self.setwindowTitle('My Electronic Inventory v: 0.1')
self.setGeometry(10,10,400,500)
self.UI()
self.show()
self.databaseIsConect()
def UI(self):
self.mainCentralWidget = QWidget()
self.mainLayout = QVBoxLayout()
self.setCentralWidget(self.mainCentralWidget)
self.centralWidget().setLayout(self.mainLayout)
self.newComponentButton= QPushButton("Add component")
self.newComponentButton.clicked.connect(self.newComponentButtonClicked)
self.table= QTableView()
self.model = QsqlRelationalTableModel(self)
self.model.setTable('main')
self.model.setEditStrategy(QsqlTableModel.OnFieldChange)
self.model.setRelation(1,"nameOfCm"))
self.model.setRelation(2,"typeOfCm"))
self.model.select()
self.table.setModel(self.model)
self.table.setItemDelegate(QsqlRelationalDelegate(self.table))
self.table.setEditTriggers(QAbstractItemView.DoubleClicked|QAbstractItemView.AnyKeypressed)
self.model.setHeaderData(0,Qt.Horizontal,('Part Number'))
self.model.setHeaderData(1,('Name'))
self.model.setHeaderData(2,('Type'))
self.mainLayout.addWidget(self.newComponentButton)
self.mainLayout.addWidget(self.table)
def databaseIsConect(self):
if connectDB.isopen():
print("DatabSAE Is Connected")
else:
print("Erorr!. DatabSAE Is Not Connected")
def newComponentButtonClicked(self):
row = self.model.rowCount()
self.model.insertRow(row)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = main()
sys.exit(app.exec_())
经过一些尝试,我设法通过继承 QsqlRelationalTableModel 来解决部分问题:
class MysqLmodel(QsqlRelationalTableModel):
def __init__(self,parent):
super().__init__()
def setData(self,item,value,role):
super().setData(item,role)
a= item.siblingAtColumn(1).data()
self.relationModel(2).setFilter("type_IDs like '"+a+"%'")
return True
这适用于我的问题,但存在问题:
- 在第一次运行时,如果您想更改组合框 2 中的某个项目,它会显示所有选项,但在修改之后,它只显示该项目属于组合框 1 中的项目。
- 如果您更改第 2 行的组合框 2 中的项目,那么您想更改第 3 行的组合框 2 中的项目,它会显示“PREVIoUS”行的选项,除非您提交该选项(例如通过按 Enter 按钮)或单击表格中的其他位置),然后它会自动更改为当前行的选项,现在您可以选择正确的项目。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)