pyqt5之响应槽的设计、创建子窗口

做过几次python大作业,都需要制作界面,而最简单的方式就是用pyqt来做,但常常隔的时间太久又不记得怎么使用了,导致每次开头都很难搞,于是记录一下。

本篇介绍了响应槽以及子窗口,个人认为界面设计最常用的就是这两个功能。

1.基操

首先创建好一个python项目,然后点击此处,进行窗口的设计。

在这里新建一个窗体

选择Widget,然后点击创建。

注意到改窗口的初始名为Form,可以在右边这里自定义窗口名,这里将其命名为测试窗口,然后保存在当前目录下

在pycharm中会出现这个新的test.ui文件,右键选择pyUIC,出现对应的test.py文件

然后我们将test.py文件中的类名改为Test(其实这里改不改都无所谓,只是一个命名而已)

在main函数中插入以下代码,注意要修改的地方

from PyQt5.QtWidgets import *
import sys

from test import Test

class TestUI(QWidget,Test):
    def __init__(self):
        super(TestUI, self).__init__()
        self.setupUi(self)

    def Open(self):
        self.show()

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

    main = TestUI()
    main.show()

    sys.exit(app.exec())

然后运行main函数,可以看到刚刚设置的界面。由于我们对于界面内容没有进行设置,所以它什么也没有。

2.响应槽展示表格

回到QT Designer中,选择Table Widget组件,将其拖到窗体中,拉好展示的区域的大小,然后保存。

并为它设置响应按键,使用PushButton组件。更名为“展示”。

选择响应槽,依次执行。(②是拉动)

在编辑页面新建一个槽,命名为showtable(),然后点击OK

再选中showtable(),再点击OK

此时就为这个“展示”按键设置好了槽。然后保存文件。

在代码中需要再点击一下pyUIC,每进行一次窗口的修改,都需要点击一下这里,更新代码。

可以看到test.py中多了一些东西,例如这里就是刚刚为pushButton按键设置的槽名称为showtable。记得每次更新完test.py中的代码后都要修改一次这里面的类名称为Test。其实如果只要求一个窗口的话不用特意修改,修改是为了对付多个窗口的情况,用于区分。

要展示表,首先得先设计好表。

然后随便插入几个数据

代码中,首先建一个数据库的函数,为了不用后面每次连接数据库时都要写一遍那串代码,这样有利于代码的简洁性。我的数据库名称是testui

def mydbcon():
    mydb = pymysql.connect(host='localhost',
                           user='root',
                           password='123456',
                           database='testui',
                           charset='utf8')
    return mydb

在类TestUI中添加一个函数,名为showtable,就是响应槽的名字,如果这里的这个函数名与那个槽名字不对应,会出现报错。以下是示例代码。

    # 展示信息表
    def showtable(self):
        self.tableWidget.setRowCount(0)# 设置表格的列数
        self.tableWidget.setColumnCount(4)# 设置表头,仅仅显示4列数据
        self.tableWidget.setHorizontalHeaderLabels(
            ['id', '姓名', '性别', '年龄'])
        conn = mydbcon()
        cursor = conn.cursor()
        sql = "SELECT id,name,sex,age FROM infor"  # SQL语句
        cursor.execute(sql)  # 执行SQL语句
        data = cursor.fetchall()  # 通过fetchall方法获得数据

        for row_number, row_data in enumerate(data):
            self.tableWidget.insertRow(row_number)  # 插入一行
            for column_number, data_item in enumerate(row_data):
                item = QTableWidgetItem(str(data_item))  # 创建一个QTableWidgetItem对象
                self.tableWidget.setItem(row_number, column_number, item)  # 插入数据

        cursor.close()  # 关闭游标
        conn.close()  # 关闭连接

 运行代码,点击展示按键,就可以看到表格内容了。

3.子窗口的设置

此功能是点击一个按钮弹出一个新的窗口。

新建一个窗体,设置好窗体名称,用Label组件提示信息。然后命名为child.ui保存。

回到主窗口,为其设置按键响应。步骤与上一个一样,此处槽为openchild。保存文件。

回到pycharm,将child.ui导出child.py文件,并更新test.ui

将child.py文件里的类名设置为Child

在main函数中新建一个类来设置子窗口的代码。

#子窗口
class ShowChild(QWidget,Child):
    def __init__(self):
        super(ShowChild, self).__init__()
        self.setupUi(self)

    def Open(self):
        self.show()

然后在类TestUI中添加如下代码部分来设置按键响应打开子窗口

    def Open_child(self):  # 使用ShowChild类
        if not self.child:
            self.child = ShowChild()
        self.child.Open()

    def openchild(self):  # 打开子窗口
        print("openchild clicked")
        self.Open_child()

运行代码

完整代码附上

import pymysql
from PyQt5.QtWidgets import *
import sys

from child import Child
from test import Test

def mydbcon():
    mydb = pymysql.connect(host='localhost',
                           user='root',
                           password='123456',
                           database='testui',
                           charset='utf8')
    return mydb

class TestUI(QWidget,Test):
    def __init__(self):
        super(TestUI, self).__init__()
        self.setupUi(self)
        self.child = None

    def Open(self):
        self.show()

    def Open_child(self):  # 使用ShowChild类
        if not self.child:
            self.child = ShowChild()
        self.child.Open()

    def openchild(self):  # 打开子窗口
        print("openchild clicked")
        self.Open_child()

    # 展示信息表
    def showtable(self):
        self.tableWidget.setRowCount(0)# 设置表格的列数
        self.tableWidget.setColumnCount(4)# 设置表头,仅仅显示4列数据
        self.tableWidget.setHorizontalHeaderLabels(
            ['id', '姓名', '性别', '年龄'])
        conn = mydbcon()
        cursor = conn.cursor()
        sql = "SELECT id,name,sex,age FROM infor"  # SQL语句
        cursor.execute(sql)  # 执行SQL语句
        data = cursor.fetchall()  # 通过fetchall方法获得数据

        for row_number, row_data in enumerate(data):
            self.tableWidget.insertRow(row_number)  # 插入一行
            for column_number, data_item in enumerate(row_data):
                item = QTableWidgetItem(str(data_item))  # 创建一个QTableWidgetItem对象
                self.tableWidget.setItem(row_number, column_number, item)  # 插入数据

        cursor.close()  # 关闭游标
        conn.close()  # 关闭连接

#子窗口
class ShowChild(QWidget,Child):
    def __init__(self):
        super(ShowChild, self).__init__()
        self.setupUi(self)

    def Open(self):
        self.show()

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

    main = TestUI()
    main.show()

    sys.exit(app.exec())

  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 您可以尝试使用PyQt5的QProcess类来调用进程,并使用信号和机制来处理进程的输出和结束事件,以避免主窗口响应的问题。您还可以考虑在进程中使用多线程来处理耗时的操作,以确保主窗口仍然响应用户的操作。 ### 回答2: 使用PyQt5调用进程时,可能会出现主窗口响应的情况。这通常是由于进程的执行时间较长,导致主窗口无法及时响应用户操作。 为了解决这个问题,可以考虑使用多线程来执行进程代码,这样可以保持主窗口响应性。 首先,需要导入QtCore模块中的QThread类来创建一个新的线程。 然后,在主窗口类中创建一个函数来执行进程的代码。在这个函数中,使用QProcess类来启动进程,并使用started、finished信号连接到相应的函数。 接着,在主窗口类的初始化函数中,创建一个新的线程,并将执行进程代码的函数作为线程的run方法。然后,启动线程。 最后,在主窗口类的函数中,调用进程代码的函数。 这样,进程的执行将在新的线程中进行,主窗口仍然可以响应用户的操作。当进程执行完成时,会发出finished信号,可以在相应的函数中处理结果。 需要注意的是,在进程执行的函数中不要直接更新主窗口的界面,因为界面更新应该在主线程中执行。可以通过使用信号和机制,将进程的结果传递给主线程,然后在函数中更新界面。 综上所述,通过使用多线程,可以解决PyQt5调用进程时主窗口响应的问题。 ### 回答3: 在使用PyQt5调用进程时,有时会遇到主窗口响应的问题。主窗口响应的原因可能是由于进程任务较重,导致主线程被占用而无法及时响应用户操作。为了解决这个问题,可以采用以下方法: 1.将耗时的进程任务放在后台线程中处理,使主线程能够继续响应用户操作。可以使用`QtCore.QThread`类创建一个后台线程,并在该线程中处理进程任务。 2.使用`QtCore.QTimer.singleShot`方法来定时执行进程任务,这样可以分解任务执行时间,避免阻塞主线程。可以设置一个定时器,在每次定时时间到达时执行一部分进程任务。 3.使用`QtCore.QProcess`类来管理进程,该类提供了一种更高级的方式来处理进程任务。通过`start`方法启动进程,并使用`readyRead`信号读取其输出结果。 4.将耗时任务分解为多个任务,然后在主线程和进程之间进行通信,以实现更好的响应性能。可以使用`QtCore.QThreadPool`类来管理多个任务,通过继承`QtCore.QRunnable`类并实现`run`方法来定义任务。 5.使用`asyncio`库实现异步处理任务,将进程任务设置为协程函数,然后使用`await`关键字来等待任务完成。 综上所述,以上方法可以帮助解决PyQt5调用进程时出现的主窗口响应的问题。根据具体需求和情况选择适合的方法,可以提升用户体验并改善程序性能。当然,在实施前应该先分析问题的原因,并根据具体情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值