PyQt5学习笔记(4) 用 QtCreater 信号与槽的使用

1、几个概念简述:

(1)信号与槽(Signal & Slot)是 Qt 编程的基础,是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互、操作时变得更加直观和简单。

(2)信号(Signal):就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的 CurrentIndexChanged() 信号。

(3)槽(Slot):就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

2、Qt Creator

Qt Creator是跨平台的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收购后推出的一款新的轻量级集成开发环境(IDE)。此 IDE 能够跨平台运行,支持的系统包括 Linux(32 位及 64 位)、Mac OS X 以及 Windows。根据官方描述,Qt Creator 的设计目标是使开发人员能够利用 Qt 这个应用程序框架更加快速及轻易的完成开发任务。 

3、启动Qt Creator,新建一个Qt Widget Application

Detail中class选择dialog,编译 工具选择MinGW。

4、布局 界面如下图

5、添加槽

按F4或界面顶部的这个按钮,进入编辑信号与槽模式。

在清空按钮上点住鼠标左键,拖动到编辑框上,弹出下面的界面,按钮选择clicked(), edit 空间选择 clear()函数。

 确定后可以看到界上有个箭头,从按钮指向编辑框。 

6. 参考上一篇中的方法,生成dialog.py, 写逻辑代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2019/11/24 17:33
# @Author  : dailinqing
# @Email   : dailinqing@126.com
# @File    : MyWidget.py
# @Software: PyCharm

import sys
from PyQt5.QtWidgets import QWidget,QApplication
from dialog import *   # 导入 刚才生成的 py文件

class QMyWidget(QWidget, Ui_Dialog):
    def __init__(self,parent = None):
    def __init__(self,parent = None):
        super().__init__(parent)  #调用父类的窗口函数
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

if __name__ == "__main__":

    app = QApplication(sys.argv)  #创建app
    myWidget = QMyWidget()
    myWidget.show()
    # myWidget.pushButton.setText("不关闭了")
    sys.exit(app.exec_())

 6、 运行后如下图,  编辑框写入文字后,按清空按钮可以清空所有文字。 

7、为其他控件添加槽函数

 在下划线控件上点右键,选择转到槽,选择clicked(bool)函数,确定后在dialog.cpp中生成一个函数

void Dialog::on_checkBoxUnder_toggled(bool checked)
{
    
}

复制这个函数名 on_checkBoxUnder_toggled,在QMyWidget这个类中定义一个同名函数,代码如下:

    def on_checkBoxUnder_toggled(self,checked):
        font = self.ui.textEdit.font()
        font.setUnderline(checked)
        self.ui.textEdit.setFont(font)

 运行后可以通过这个复选框来选择是否添加下划线。

8、添加自定义槽函数

自定义槽函数如下, 需要添加修饰符@pyqtSlot(),对于有不同参数的槽函数,可以在@pyqtSlot()中声明参数类型。  

    @pyqtSlot()
    def do_setTextColor(self):
        plet = self.ui.textEdit.palette()
        if (self.ui.radioButtonBlack.isChecked()):
            plet.setColor(QPalette.Text, Qt.black)
        elif (self.ui.radioButtonRed.isChecked()):
            plet.setColor(QPalette.Text, Qt.red)
        elif (self.ui.radioButtonBlue.isChecked()):
            plet.setColor(QPalette.Text, Qt.blue)

        self.ui.textEdit.setPalette(plet)

在QMyWidget构造函数中添加下面语句,实现信号和槽的关联:

self.ui.radioButtonBlack.clicked.connect(lambda:self.do_setTextColor())
self.ui.radioButtonRed.clicked.connect(lambda:self.do_setTextColor())
self.ui.radioButtonBlue.clicked.connect(lambda:self.do_setTextColor())

这里 有两个注意的地方,槽函数前需要加"lambda:",后面需要加括号, 否则会报错。

所有代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2019/11/24 17:33
# @Author  : dailinqing
# @Email   : dailinqing@126.com
# @File    : MyWidget.py
# @Software: PyCharm

import sys
from PyQt5.QtWidgets import QWidget,QApplication
from PyQt5.QtGui import QPalette
from PyQt5.QtCore import Qt,pyqtSlot
from dialog import *   # 导入 刚才生成的 py文件

class QMyWidget(QWidget, Ui_Dialog):
    def __init__(self,parent = None):
        super().__init__(parent)  #调用父类的窗口函数
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

        self.ui.radioButtonBlack.clicked.connect(lambda:self.do_setTextColor())
        self.ui.radioButtonRed.clicked.connect(lambda:self.do_setTextColor())
        self.ui.radioButtonBlue.clicked.connect(lambda:self.do_setTextColor())

    @pyqtSlot()
    def do_setTextColor(self):
        plet = self.ui.textEdit.palette()
        if (self.ui.radioButtonBlack.isChecked()):
            plet.setColor(QPalette.Text, Qt.black)
        elif (self.ui.radioButtonRed.isChecked()):
            plet.setColor(QPalette.Text, Qt.red)
        elif (self.ui.radioButtonBlue.isChecked()):
            plet.setColor(QPalette.Text, Qt.blue)

        self.ui.textEdit.setPalette(plet)

    def on_checkBoxUnder_toggled(self,checked):
        font = self.ui.textEdit.font()
        font.setUnderline(checked)
        self.ui.textEdit.setFont(font)

    def on_checkBoxItalic_toggled(self,checked):
        font = self.ui.textEdit.font()
        font.setItalic(checked)
        self.ui.textEdit.setFont(font)

    def on_checkBoxBold_toggled(self,checked):
        font = self.ui.textEdit.font()
        font.setBold(checked)
        self.ui.textEdit.setFont(font)


if __name__ == "__main__":

    app = QApplication(sys.argv)  #创建app
    myWidget = QMyWidget()
    myWidget.show()
    sys.exit(app.exec_())

 

发布了62 篇原创文章 · 获赞 18 · 访问量 12万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览