作为QT的核心,信号与槽用于QT对象间的通信。信号与槽的实现必须使用connect关联,对象收到信号之后按照事先设置好的信号/槽机制来处理信号。因实现过程类似于函数间的调用,所以也把信号称为信号函数,槽称为槽函数。 为此,QT还引入了自己独有的一些关键字,比如:slots、emit、signals。
widget.h
class Widget : public QWidget { Q_OBJECT//使用信号和槽必须加上 //信号 signals: void testclicked(); //自己写的信号声明,不需要实现,使用库提供的信号不需要声明 private slots: void printText(); //槽的声明,必须实现 };widget.cpp
Widget::Widget(QWidget *parent) : QWidget(parent) { //连接btn的clicked信号和printText槽 //QObject::connect(btn,SIGNAL(clicked()),this,SLOT(printText())); QObject::connect(btn,&QPushButton::clicked,this,&Widget::printText); //信号和信号的连接 //信号可以传递给另一个信号,再触发一个槽 QObject::connect(btn,SIGNAL(clicked()),this,SIGNAL(testclicked())); QObject::connect(this,SIGNAL(testclicked()),this,SLOT(printText())); } void Widget::printText() { qDebug("printText()"); //debug函数,需声明头文件#include<QDebug> }3.连接信号与槽(两种方法)
QObject::connect(发送信号的对象地址,信号SIGNALS(...),接收信号对象地址,槽函数SLOT(...)); //一个信号可以连接到多个槽,多个信号也可以连接到一个槽 //新的连接信号和槽的方法: QObject::connect(发送信号的对象地址,&类名::信号名,接收信号对象地址,&类名::槽函数名);信号
信号使用signals关键字声明,不添加修饰符,默认是public,参考上面案例;信号只需声明,不需实现,可以传参数,实现过程酷似函数,但其调用方式不同,信号需要使用emit关键字发送;如 emit func(1);不能对信号进行定义,信号是由moc自动生成的;信号只能返回void类型。槽
声明槽需要使用slots关键字,且需要添加访问权限,如public:;槽不同于普通函数于他可以与信号关联,平常使用与普通函数无异。两者的联系
槽的参数不能多于信号的参数,如槽接收不到全部参数,函数内部则会产生多余参数的运算,导致结果错误,所以信号槽的参数的类型及个数要等于信号参数的类型;若信号的参数多余槽的参数,则多余的参数将被忽略;一个信号可以关联多个槽,多个信号也可以关联同一个槽,信号也可以关联到另一个信号上;当一个信号关联多个槽时,则发送信号时,槽函数按照关联的顺序依次执行;当信号关联另一个信号,则第一个信号发送时,会立即发送第二个信号;信号与槽可以使用Qt内部预定义的,也可以自己定义。参数对应widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QLabel> #include <QPushButton> class Widget : public QWidget { Q_OBJECT//使用信号和槽必须加上 public: Widget(QWidget *parent = nullptr); ~Widget(); void sendmyclicked(); private: QLabel *lab; QPushButton *btn; //当前文字颜色标志位,红->0, 绿->1 int flag; //自定义信号 signals: void myclicked(int num);//信号的声明 void testclicked(); //自定义槽 private slots: void printText(); void myprintText(int n); }; #endif // WIDGET_Hwidget.cpp
#include "widget.h" #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent) { flag = 0; //默认标志位 lab = new QLabel(this); btn = new QPushButton("变颜色",this); //设置内容 lab->setText("我会变色"); //设置窗口,lab的大小和显示位置 this->resize(800,480); lab->resize(100,50); lab->move(200,100); btn->resize(100,50); btn->move(400,400); //设置字体 QFont f("Times",16,16,flase); lab->setFont(f); //设置颜色 QColor c(255,0,0); QPalette p; p.setColor(QPalette::WindowText,c);//设置前景颜色 lab->setPalette(p); //设置鼠标形状 QCursor cursor(Qt::PointingHandCursor); lab->setCursor(cursor); //连接btn的clicked信号和printText槽 //QObject::connect(btn,&QPushButton::clicked,this,&Widget::printText); QObject::connect(this,SIGNAL(myclicked(int)),this,SLOT(myprintText(int))); //信号和信号的连接 QObject::connect(btn,SIGNAL(clicked()),this,SIGNAL(testclicked())); QObject::connect(this,SIGNAL(testclicked()),this,SLOT(printText())); } Widget::~Widget() { } void Widget::sendmyclicked() { //发送信号 emit myclicked(100); } //槽函数的实现 void Widget::printText() { QPalette p; //Qt中调试输出使用QDebug qDebug("printText()"); qDebug()<<"打印打印"; if(flag){ QColor c(255,0,0); p.setColor(QPalette::WindowText,c);//设置前景颜色 lab->setPalette(p); flag = 0; } else{ QColor c(0,255,0); p.setColor(QPalette::WindowText,c);//设置前景颜色 lab->setPalette(p); flag = 1; } } void Widget::myprintText(int n) { qDebug("myprintText(),n = %d\n",n); }main.cpp
#include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.sendmyclicked(); w.show(); return a.exec(); }