QComboBox с использованием QQueryModel, получая поле идентификатора (не отображается) из нажатой

PyQt5 - QComboBox, заполненный QQueryModel, включая Id; Название;.. и т. д. поля. Используя Имя как QComboBox.modelColumn. Надеюсь получить поле идентификатора из выбранного элемента.

Я переместил 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()

Нужно посоветовать, как идти вперед. Вся база данных, которую я использую, основана на полях идентификаторов, и мне нужно продолжить запрос по любой причине. Может быть, инструменты меняются? Другой подход.

1 ответ

QCombobox имеет два сигнала, подходящих для ваших нужд:activated() отправляется, когда пользователь выбирает элемент, даже если выбор не изменился, см. QComboBox.activation ()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;
Другие вопросы по тегам