python - QComboBox使用QQueryModel,从点击中获取id字段(不显示)

标签 python mysql pyqt5 qtsql

PyQt5 - QComboBox 填充了 QQueryModel,包括 Id;姓名; ..等领域。使用名称作为 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;

关于python - QComboBox使用QQueryModel,从点击中获取id字段(不显示),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53960010/

相关文章:

python - 如何获取 Kivy TextInput 或 Label 的字符宽度

python - 向 Cell OpenPyXL 添加背景颜色

mysql - 使用 sequelize 在 mySql 中定义静态函数(如 Mongoose )

java - 线程中的异常 "AWT-EventQueue-0"org.hibernate.QueryException : could not resolve property: Id of:

python - pyQt5从字典创建按钮连接到具有附加值的函数

python - 仅从 subprocess.check_output 获取 stderr 输出

python - 返回姓名首字母大写的函数

mysql - 将时间戳日期更改为今天,但保留 hh :mm:ss part

python - 在子类对话框窗口中使用方法影响主窗口时出现问题

python - PyQt 5.9 中的 OpenLayers 地理定位