QComboBox 使用 QQueryModel,从被点击的对象中获取 id 字段(不显示)

QComboBox using QQueryModel, getting the id field (not display) from the clicked

PyQt5 - QComboBox 填充了包含 Id 的 QQueryModel;姓名; ..等领域。使用名称作为 QComboBox.modelColumn。希望从点击的项目中检索 id 字段。

我来回移动了 ModelColumn,但没有任何好处。我还访问了 QQueryModel.record 发现它总是在第一条记录上,而不是在当前记录上。

import MySQL_Connector
import sys
from PyQt5.QtCore import QVariant, Qt
from PyQt5.QtSql import QSqlDatabase, QSqlQueryModel,QSqlQuery , QSqlTableModel, QSqlError, QSqlQueryModel, QSqlQuery
from PyQt5.QtWidgets import QApplication, QMainWindow
from MainUI import Ui_MainWindow


class QConnectionError(Exception):
    pass


class MainWindow(QMainWindow, Ui_MainWindow):


    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)

        #setup Qsql databaase objects
        cnn = MySQL_Connector.MysqlConnection('config.ini')
        con_string = cnn.read_db_config()[1]
        try:
            db = QSqlDatabase.addDatabase("QMYSQL")
            db.setHostName(con_string['host'])
            db.setUserName(con_string['user'])
            db.setDatabaseName(con_string['database'])
            db.setPassword(con_string['password'])
            ok = db.open()
            if not ok:
                raise QConnectionError("Connection failed--- Is the server running?")
        except QConnectionError as err:
            print("You'll have to wait until a connection is established")
            return
        finally:
            if db.isOpen():
                db.close()
        self.qdb = db
        self.qdb.open()
        # set combobox
        self.comboQuery = combo_query(self.qdb)
        self.comboModel = QSqlQueryModel()
        self.comboModel.setQuery(self.comboQuery)

        self.comboBox.setModel(self.comboModel)
        self.comboBox.setModelColumn(1)
        self.comboBox.activated[int].connect(self.do_action)

       #populate textView
        self.query = test(self.qdb)
        self.model = QSqlQueryModel()
        self.model.setQuery(self.query)
        self.model.setHeaderData(0,Qt.Horizontal, "ID")
        self.model.setHeaderData(1, Qt.Horizontal, "Nombre")

        self.tableView.rowHeight(2)
        self.tableView.fontMetrics()
        self.tableView.setModel(self.model)
        self.show()
        if self.qdb.isOpen():
            self.qdb.close()

    def do_action(self,  str): #Experimenting 
        print(str, type(str))
        self.tableView.selectRow(5)



def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    app.exec()

需要有关如何前进的建议。我使用的所有数据库都是基于 ID 字段的,无论出于何种原因,我都需要进一步查询。也许工具改变了?一种不同的方法。

QCombobox 有两种适合您需要的信号: activated() 当用户选择一个项目时发送,即使选择没有改变,见 QComboBox.activated() currentIndexChanged() 如果当前索引被更改,用户选择或以编程方式更改,请参阅 QComboBox.currentIndexChanged()

两个信号都通过当前索引。 使用此索引,您可以通过 QSqlQuery.data().

获得所需的数据

这里是一个使用 sqlite3 的简单示例,我认为您可以根据自己的数据库进行调整:

import sqlite3
from PyQt5 import QtWidgets, QtSql

class MyWidget(QtWidgets.QWidget): 
    def __init__(self): 
        QtWidgets.QWidget.__init__(self) 

        self.database = QtSql.QSqlDatabase('QSQLITE')
        self.database.setDatabaseName('tc.db')
        self.database.open()

        self.dataModel = QtSql.QSqlQueryModel()
        self.dataModel.setQuery('select id, name from items', self.database)

        self.comboBox = QtWidgets.QComboBox(self)
        self.comboBox.setModel(self.dataModel)
        self.comboBox.setModelColumn(1)

        self.comboBox.currentIndexChanged.connect(self.do_action)
        # self.comboBox.activated.connect(self.do_action)

    def do_action(self, i):
        id = self.dataModel.data(self.dataModel.index(i, 0))        # self.dataModel.index(row, column)
        name = self.dataModel.data(self.dataModel.index(i, 1))
        print(i, 'id: ', id, 'name: ', name)

qApp = QtWidgets.QApplication([])    
widget = MyWidget() 
widget.show()
qApp.exec_()

这里是数据库的转储 tc.db:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "items" (
    "id" INTEGER PRIMARY KEY NOT NULL,
    "name" TEXT NOT NULL
);
INSERT INTO items VALUES(0,'abcde');
INSERT INTO items VALUES(1,'fghijk');
INSERT INTO items VALUES(2,'lmnop');
INSERT INTO items VALUES(3,'qrstuv');
COMMIT;