网站转化率,com域名便宜,建模培训哪家好,建筑工程招聘网站哪个好目录
1、自定义信号的规定
2、创建自定义信号
3、带参数的信号与槽
4、一个信号连接多个槽
5、信号与槽的断开
结语 前言#xff1a; 虽然Qt已经内置了大量的信号#xff0c;并且这些信号能够满足大部分的开发场景#xff0c;但是Qt仍然允许开发者自定义信号#…目录
1、自定义信号的规定
2、创建自定义信号
3、带参数的信号与槽
4、一个信号连接多个槽
5、信号与槽的断开
结语 前言 虽然Qt已经内置了大量的信号并且这些信号能够满足大部分的开发场景但是Qt仍然允许开发者自定义信号给开发者提供了足够的DIY设计空间。
1、自定义信号的规定 Qt中的信号实际上就是函数因此自定义信号本质就是自定义函数只不过自定义信号函数的写法要遵循以下三点 1、Qt提供了关键字“signals”自定义信号函数必须写在 “signals” 关键字下边。 2、自定义信号函数只需要声明不需要实现返回值要为void。 3、自定义信号函数可以有形参允许重载。 当然有了自定义信号函数后还需要拥有将该信号发出的能力可以使用emit关键字修饰信号函数表示发送该信号。emit 是⼀个空的宏。
2、创建自定义信号 有了上述的规则后可以手动创建一个自定义信号并给该信号连接一个槽函数槽函数内打印一条语句运行代码后若输出窗口中打印出了语句说明自定义信号成功创建具体代码如下。 1、widget.h的代码如下
#ifndef WIDGET_H
#define WIDGET_H#include QWidgetQT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTsignals:void mySignal();//自定义信号public:Widget(QWidget *parent nullptr);~Widget();void Print();//槽函数声明private:Ui::Widget *ui;
};
#endif // WIDGET_H2、widget.cpp的代码如下
#include widget.h
#include ui_widget.h#include QDebug
#include QPushButtonWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);connect(this,Widget::mySignal,this,Widget::Print);//连接信号与槽emit mySignal();//发送信号
}Widget::~Widget()
{delete ui;
}void Widget::Print()
{qDebug()自定义信号调用的自定义槽函数;
} 运行结果 从结果可以看到槽函数里的语句被打印说明自定义信号成功被触发且执行了对应的槽函数。
3、带参数的信号与槽 Qt中的信号与槽在代码的层面上都是函数既然是函数所以他们都可以有形参不过严格规定信号的参数要与连接的槽的参数类型保持一致信号的参数多于槽参数都是可以的。当发送该信号时调用信号所传的实参会传给信号函数的形参然年信号函数再传递给槽函数示意图如下 代码实现如下1、widget.h的代码如下
#ifndef WIDGET_H
#define WIDGET_H#include QWidgetQT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTsignals:void mySignal(QString s);//自定义信号public:Widget(QWidget *parent nullptr);~Widget();void Print(QString s);//槽函数声明private:Ui::Widget *ui;
};
#endif // WIDGET_H2、widget.cpp的代码如下
#include widget.h
#include ui_widget.h#include QDebug
#include QPushButtonWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);connect(this,Widget::mySignal,this,Widget::Print);//连接信号与槽emit mySignal(这是一个带有参数的信号);//发送信号
}Widget::~Widget()
{delete ui;
}void Widget::Print(QString s)
{qDebug()s;
} 测试结果 4、一个信号连接多个槽 上述的例子中是一个信号连接一个槽函数因此当发送该信号时会调用一次槽函数。那么当一个信号连接多个槽函数时发送该信号时具体的调用方式是什么呢代码测试如下。 1、widget.h的代码如下
#ifndef WIDGET_H
#define WIDGET_H#include QWidgetQT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTsignals:void mySignal(QString s);//自定义信号public:Widget(QWidget *parent nullptr);~Widget();void Print(QString s);//槽函数声明1void Print2(QString s);//槽函数声明2private:Ui::Widget *ui;
};
#endif // WIDGET_H2、widget.cpp的代码如下
#include widget.h
#include ui_widget.h#include QDebug
#include QPushButtonWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);connect(this,Widget::mySignal,this,Widget::Print);//连接信号与槽connect(this,Widget::mySignal,this,Widget::Print2);//连接信号与槽emit mySignal(这是一个带有参数的信号);//发送信号
}Widget::~Widget()
{delete ui;
}void Widget::Print(QString s)
{qDebug()s槽函数1;
}void Widget::Print2(QString s)
{qDebug()s槽函数2;
} 测试结果 结果是当一个信号连接多个槽时发送该信号会调用所有连接的槽的函数侧面也反映出不仅仅是一个信号可以连接多个槽一个槽也可以被多个信号连接只不过这种方式的逻辑就和单个信号连接单个槽的逻辑一样这里就不再展示代码了。
5、信号与槽的断开 使⽤disconnect函数即可完成断开disconnect的⽤法和connect相似disconnect的形参和connect是一样的即连接的逻辑和断开的逻辑是一样的。比如在上述代码中一个信号连接了两个槽函数使用disconnect函数断开与其中一个槽函数的连接那么发送信号时只会执行一个槽函数测试结果如下 从结果可以看到只执行了一个槽函数。
结语 以上就是关于自定义信号的讲解自定义信号虽然用的不多但是其延申出来的知识可以帮助我们进一步理解信号与槽的细节。 最后如果本文有遗漏或者有误的地方欢迎大家在评论区补充谢谢大家