Python, Qt, ComboBox, two columns?



这个问题很简单,但就答案而言:

我正在将QT与Python和SQL一起使用。 我得到了一些查询数据:"选择 ID,部门中的部门" 我想创建包含两列(id,部门(的组合框,它将仅显示"部门"(部门 1、部门 2 等(,但在选择后,它应该返回"id"。

换句话说:我正在寻找与 c# 中组合框的displaymembervaluemember相同的功能。

我设法在Combobox中创建了一个Qtableview,但是一个问题创建了另一个问题(视图,读取"id"等(。 还有其他更简单的方法吗?

正如 OP 指出它使用 QSqlTableModel,那么模仿 C# 行为的可能解决方案是建立将通过 modelColumn 属性显示的列,然后使用与所选行关联的 QSqlRecord 访问相应的项(id 和其他字段(。

from PyQt5 import QtCore, QtWidgets, QtSql

def createConnection():
db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName(":memory:")
if not db.open():
QtWidgets.QMessageBox.critical(
None,
QtWidgets.qApp.tr("Cannot open database"),
QtWidgets.qApp.tr(
"Unable to establish a database connection.n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information "
"how to build it.nn"
"Click Cancel to exit."
),
QtWidgets.QMessageBox.Cancel,
)
return False
query = QtSql.QSqlQuery()
query.exec_(
"CREATE TABLE  Departments (id INTEGER PRIMARY KEY AUTOINCREMENT, department TEXT);"
)
query.exec_("INSERT INTO Departments(department) VALUES('department1')")
query.exec_("INSERT INTO Departments(department) VALUES('department2')")
query.exec_("INSERT INTO Departments(department) VALUES('department3')")
query.exec_("INSERT INTO Departments(department) VALUES('department4')")
query.exec_("INSERT INTO Departments(department) VALUES('department5')")
return True

class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.model = QtSql.QSqlTableModel(self)
self.model.setTable("Departments")
self.model.select()
self.tableview = QtWidgets.QTableView()
self.tableview.setModel(self.model)
self.combo = QtWidgets.QComboBox()
self.combo.setModel(self.model)
column = self.model.record().indexOf("department")
self.combo.setModelColumn(column)
self.combo.currentIndexChanged.connect(self.onCurrentIndexChanged)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(self.tableview)
lay.addWidget(self.combo)
@QtCore.pyqtSlot(int)
def onCurrentIndexChanged(self, index):
column = self.model.record().indexOf("id")
r = self.model.record(index)
value = r.value(column)
print(value)

if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
if not createConnection():
sys.exit(1)
w = Widget()
w.show()
sys.exit(app.exec_())

另一种解决方案是,根据pyodbc获得的数据,您可以构建QStandardItemModel(或其他模型(,其中隐藏字段与随后可以获得的角色相关联。

from PyQt5 import QtCore, QtGui, QtWidgets
IdRole = QtCore.Qt.UserRole + 1000

class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
d = (
(1, "department1"),
(2, "department2"),
(3, "department3"),
(4, "department4"),
(5, "department5"),
)
self.model = QtGui.QStandardItemModel(self)
for id_, value in d:
it = QtGui.QStandardItem(value)
it.setData(id_, IdRole)
self.model.appendRow(it)
self.combo = QtWidgets.QComboBox()
self.combo.setModel(self.model)
self.combo.currentIndexChanged.connect(self.onCurrentIndexChanged)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(self.combo)
@QtCore.pyqtSlot(int)
def onCurrentIndexChanged(self, index):
id_ = self.combo.itemData(index, IdRole)
# or
# id_ = self.model.item(index).data(IdRole)
print(id_)

if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())

最新更新