【问题标题】:QComboBox using QQueryModel, getting the id field (not display) from the clicked使用 QQueryModel 的 QComboBox,从点击中获取 id 字段(不显示)
【发布时间】:2018-12-28 14:24:16
【问题描述】:

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 字段的,无论出于何种原因,我都需要进一步查询。也许是工具改变?一种不同的方法。

【问题讨论】:

    标签: python mysql pyqt5 qtsql


    【解决方案1】:

    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;
    

    【讨论】:

      猜你喜欢
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2019-09-12
      • 2020-03-11
      • 1970-01-01
      相关资源
      最近更新 更多