• QT 自定义信号和槽 学习笔记


    实际开发中,如果仅使用Qt提供的信号函数和槽函数,会经常遇到信号函数的参数类型和个数无法满足实际需求、信号函数和槽函数的参数类型不匹配等问题。解决此类问题,最简单有效的方式就是:自定义场景需要的信号函数和槽函数。
    1.自定义信号

    条件

    定义在某个类中,

    该类直接或间接继承自QObject类;

    用signals 关键字修饰;

    函数只需要函数的返回值类型为void,参数的类型和个数不限。

    1. #ifndef MYPUSHBUTTON_H
    2. #define MYPUSHBUTTON_H
    3. #include
    4. #include
    5. class MyPushButton:public QPushButton
    6. {
    7. Q_OBJECT
    8. public:
    9. MyPushButton();
    10. void MySetText();
    11. signals:
    12. void MyClecked(QString &qstr);
    13. };
    14. #endif // MYPUSHBUTTON_H

    1. #include "mypushbutton.h"
    2. MyPushButton::MyPushButton()
    3. {
    4. }
    5. void MyPushButton::MySetText()
    6. {
    7. QString qstr="Hello";
    8. emit MyClecked(qstr);
    9. }

    2.自定义槽函数

    条件

    和信号函数不同,槽函数必须手动定义(实现)。槽函数可以在程序中直接调用,但主要用来响应某个信号。自定义一个槽函数时,需要注意以下几点:

    槽函数的返回值必须和信号函数相同,由于信号函数的返回值一定是void,所以槽函数的返回值也必须为void;

    对于带参的信号函数,槽函数可以选择接收所有参数,则参数的类型、顺序、个数都必须与信号函数相同;也可以选择接收前几个参数,这些参数的类型、顺序都必须与信号函数相同;还可以选择不接受任何参数。

    槽函数的参数个数只能比信号函数少,不能比信号函数多;

    槽函数的参数不能有默认值。

    slots 关键字可以和public、protected、private搭配使用,它们的区别是:

    public slots:该关键字修饰的槽函数,既可以在当前类及其子类的成员函数中调用,也可以在类外部的其它函数(比如main()函数)中调用;

    protected slots:该关键字修饰的槽函数,仅允许在当前类及其子类的成员函数内调用,不能在类外部的其它函数内调用;

    private slots:该关键字修饰的槽函数,只允许在当前类的成员函数内调用,不能在子类中调用,也不能在类外部的其它函数内调用。
    通常情况下,槽函数使用public slots 修饰。

    1. #ifndef MYLABEL_H
    2. #define MYLABEL_H
    3. #include
    4. class MyLabel:public QLabel
    5. {
    6. Q_OBJECT
    7. public:
    8. MyLabel();
    9. void MySetText();
    10. };
    11. #endif // MYLABEL_H
    1. #include "mylabel.h"
    2. MyLabel::MyLabel()
    3. {
    4. }
    5. void MyLabel::MySetText()
    6. {
    7. setText("Hellow");
    8. }
    想实现通过按钮 显示标签   但是信号和槽函数参数不匹配  一个有参数  一个没参数    我们这里可以通过自定义槽和信号来实现
    //改信号
        //QObject::connect(&but,&QPushButton::clicked,&but,&MyPushButton::MySetText);
        //QObject::connect(&but,&MyPushButton::MyClecked,&lab,&QLabel::setText);
     
    
        //改槽
        //QObject::connect(&but,&QPushButton::clicked,&lab,&MyLabel::MySetText);
    1. int main(int argc, char *argv[])
    2. {
    3. QApplication a(argc, argv);
    4. Widget w;
    5. // //QPushButton but(&w);
    6. // MyPushButton but;
    7. // but.setParent(&w);
    8. // MyLabel lab;
    9. // lab.setParent(&w);
    10. // lab.move(200,100);
    11. // but.move(200,200);
    12. // but.setText("按一下显示文字");
    13. // lab.resize(200,100);
    14. //想实现通过按钮 显示标签 但是信号和槽函数参数不匹配 一个有参数 一个没参数
    15. //我们这里可以通过自定义槽和信号来实现
    16. //QObject::connect(&but,&QPushButton::clicked,&lab,&QLabel::setText);
    17. //改信号
    18. //QObject::connect(&but,&QPushButton::clicked,&but,&MyPushButton::MySetText);
    19. //QObject::connect(&but,&MyPushButton::MyClecked,&lab,&QLabel::setText);
    20. //改槽
    21. //QObject::connect(&but,&QPushButton::clicked,&lab,&MyLabel::MySetText);
    22. w.show();
     
    

    除了上述两种方法  我们也可以通过widget来修改

    对按钮 的clicked信号添加一个槽

     widget中 多了一个

    public slots:
        void on_pushButton_clicked();槽函数

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. QT_BEGIN_NAMESPACE
    5. namespace Ui { class Widget; }
    6. QT_END_NAMESPACE
    7. class Widget : public QWidget
    8. {
    9. Q_OBJECT
    10. public:
    11. Widget(QWidget *parent = nullptr);
    12. ~Widget();
    13. public slots:
    14. void on_pushButton_clicked();
    15. private:
    16. Ui::Widget *ui;
    17. };
    18. #endif // WIDGET_H
    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. Widget::Widget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::Widget)
    6. {
    7. ui->setupUi(this);
    8. }
    9. Widget::~Widget()
    10. {
    11. delete ui;
    12. }
    13. void Widget::on_pushButton_clicked()
    14. {
    15. ui->label->setText("hello");
    16. }

    对void Widget::on_pushButton_clicked()进行实现  让他改变标签的文字

    结果如下

    点击按钮 

     

  • 相关阅读:
    Dockerfile(6) - EXPOSE 指令详解
    Java 静态代理和动态代理
    Java在云原生的破局利器——AOT(JIT与AOT)
    网络安全(黑客)自学
    城市数字孪生效果怎么样?实景三维国内公司强荐广州华锐互动
    Open3D(C++) 最小二乘拟合二维直线(拉格朗日乘子法)
    Python程序笔记2023004
    研究了11种实时聊天软件,我发现都具备这些功能…
    【ES实战】ES上的native realm安全方式使用
    web前端-html-css-display
  • 原文地址:https://blog.csdn.net/van9527/article/details/126011330