欢迎访问宙启技术站
智能推送

PyQt5中QThread与数据库操作的结合实例

发布时间:2023-12-26 19:50:17

在PyQt5中,可以使用QThread来进行线程的创建和管理,并通过线程进行数据库的操作。下面是一个使用PyQt5的QThread与数据库操作结合的实例,并附带使用例子。

在这个实例中,我们将创建一个用于查询数据库的线程,并通过线程来搜索数据库中的数据。具体步骤如下:

1. 导入必要的模块:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QHBoxLayout, QVBoxLayout, QPushButton, QLabel, QLineEdit, QTextEdit
from PyQt5.QtCore import QThread
from PyQt5.QtSql import QSqlDatabase, QSqlQuery

2. 创建一个自定义的线程类,用于执行数据库操作:

class DatabaseThread(QThread):
    def __init__(self, query_str):
        super().__init__()
        self.query_str = query_str

    def run(self):
        db = QSqlDatabase.addDatabase('QMYSQL')
        db.setHostName('localhost')
        db.setDatabaseName('test')
        db.setUserName('root')
        db.setPassword('password')
        if db.open():
            query = QSqlQuery()
            query.exec_(self.query_str)
            result = ""
            while query.next():
                result += query.value(0) + "
"

            self.result.emit(result)
        else:
            self.result.emit("Failed to connect to database.")

3. 创建一个主窗口类,用于显示用户界面和处理用户输入:

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Database Search")
        self.setGeometry(100, 100, 500, 400)

        layout = QVBoxLayout()
        search_layout = QHBoxLayout()

        self.search_label = QLabel("Search:")
        self.search_lineedit = QLineEdit()
        self.search_button = QPushButton("Search")
        self.search_button.clicked.connect(self.search_button_clicked)

        search_layout.addWidget(self.search_label)
        search_layout.addWidget(self.search_lineedit)
        search_layout.addWidget(self.search_button)

        layout.addLayout(search_layout)

        self.result_textedit = QTextEdit()
        layout.addWidget(self.result_textedit)

        central_widget = QWidget()
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

    def search_button_clicked(self):
        query_str = "SELECT name FROM users WHERE name LIKE '%{0}%'".format(self.search_lineedit.text())
        self.thread = DatabaseThread(query_str)
        self.thread.result.connect(self.show_result)
        self.thread.start()

    def show_result(self, result):
        self.result_textedit.setText(result)

4. 创建一个应用程序对象,并在应用程序中创建主窗口:

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

    db = QSqlDatabase.addDatabase('QMYSQL')
    db.setHostName('localhost')
    db.setDatabaseName('test')
    db.setUserName('root')
    db.setPassword('password')

    if not db.open():
        print("Failed to connect to database.")
        sys.exit()

    main_window = MainWindow()
    main_window.show()

    sys.exit(app.exec_())

这个例子中,首先导入了必要的模块,包括PyQt5的相关模块和QThread和QSql的类。然后创建了一个自定义的QThread子类,重写了run方法,在其中连接数据库,并执行查询操作。查询结果通过QThread的信号传递给主窗口类,主窗口类通过信号的槽函数显示查询结果。

运行以上代码,应用程序窗口会显示一个搜索框和一个搜索按钮。用户可以输入要搜索的关键字,并点击搜索按钮进行查询。查询结果将显示在应用程序窗口的文本框中。

以上就是使用PyQt5的QThread与数据库操作结合的实例,并附带使用例子的描述。你可以根据实际需求进行修改和扩展,以实现更复杂的功能。