qcombobox使用qquerymodel,从单击的

1rhkuytd  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(393)

pyqt5-填充有qquerymodel(包括id)的qcombobox;名称。。etc字段。将名称用作qcombobox.modelcolumn。希望从单击的项目中检索id字段。
我前后移动了模型柱,但没有做任何有益的事情。我还访问了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字段的,无论什么原因,我都需要进一步查询。也许换个工具?另一种方法。

e7arh2l6

e7arh2l61#

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;

相关问题