Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
270 views
in Technique[技术] by (71.8m points)

python - populate combobox editable username and line edit password from sqlite3

I have 1 combobox editable username and 1 line edit password i want load user list from database sqlite3 to combobox. After load list i want action on itemlist combobox get password current selected user from database.

pyqt5 application

table columns

table records

######Combo Box 2 - PM's
        self.groupBox_2 = QtWidgets.QGroupBox(self.tab)
        self.groupBox_2.setGeometry(QtCore.QRect(10, 140, 191, 51))
        self.groupBox_2.setObjectName("groupBox_2")
        self.comboBox_3 = QtWidgets.QComboBox(self.groupBox_2)
        self.comboBox_3.setGeometry(QtCore.QRect(10, 20, 171, 22))
        self.comboBox_3.setObjectName("comboBox_3")
        self.comboBox_3.addItems(self.pm_Combo)

def pm_Combo(self):
        conn = sqlite3.connect('testdb.db')
        c = conn.cursor()
        c.execute("SELECT DISTINCT projectmanager FROM testtable2")
        pmList = c.fetchall()
        conn.commit()
        conn.close()
question from:https://stackoverflow.com/questions/65546101/combobox-pyqt5-how-to-show-the-name-but-store-the-id-of-the-table

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Assuming that the table is called "user" then you can use the userData to save the information and set it in the QLineEdit when the currentIndex of the QComboBox changes:

import os
import sqlite3
import sys

from PyQt5 import QtWidgets, QtSql


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.username_combo = QtWidgets.QComboBox()
        self.password_lineedit = QtWidgets.QLineEdit()

        button_login = QtWidgets.QPushButton(self.tr("Login"))

        lay = QtWidgets.QFormLayout(self)
        lay.addRow(self.tr("Username:"), self.username_combo)
        lay.addRow(self.tr("Password:"), self.password_lineedit)
        lay.addRow(button_login)

        self.username_combo.currentIndexChanged.connect(self.update_password)

        self.load_usernames()

    def load_usernames(self):
        current_dir = os.path.dirname(os.path.realpath(__file__))
        db_path = os.path.join(current_dir, "testdb.db")

        self.username_combo.clear()
        with sqlite3.connect(db_path) as conn:
            cursor = conn.execute("SELECT DISTINCT username, password FROM User")
            for result in cursor.fetchall():
                username, password = result
                self.username_combo.addItem(username, password)

    def update_password(self):
        self.password_lineedit.setText(self.username_combo.currentData())


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

Another possible solution is to use QSqlQueryModel with QDataWidgetMapper:

import os
import sys

from PyQt5 import QtWidgets, QtSql


def create_connection():
    current_dir = os.path.dirname(os.path.realpath(__file__))
    db_path = os.path.join(current_dir, "testdb.db")

    db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
    db.setDatabaseName(db_path)
    if not db.open():
        print("error: {}".format(db.lastError().text()))
        return False
    return True


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.username_combo = QtWidgets.QComboBox()
        self.password_lineedit = QtWidgets.QLineEdit()

        button_login = QtWidgets.QPushButton(self.tr("Login"))

        lay = QtWidgets.QFormLayout(self)
        lay.addRow(self.tr("Username:"), self.username_combo)
        lay.addRow(self.tr("Password:"), self.password_lineedit)
        lay.addRow(button_login)
        self.load_data()

    def load_data(self):
        self.model = QtSql.QSqlQueryModel()
        self.model.setQuery("""SELECT DISTINCT username, password FROM User""")
        self.mapper = QtWidgets.QDataWidgetMapper()
        self.mapper.setModel(self.model)
        self.mapper.addMapping(self.password_lineedit, 1)
        self.username_combo.currentIndexChanged.connect(self.mapper.setCurrentIndex)
        self.username_combo.setModel(self.model)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    if not create_connection():
        sys.exit(-1)

    w = Widget()
    w.show()

    sys.exit(app.exec_())

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...