嵌入式QT基础-信号与槽原理及应用

it2024-11-05  6

信号与槽

信号与槽概述信号与槽语法信号与槽步骤及参数理解信号与槽偏语法(不常用)信号与槽使用注意事项案例

信号与槽概述

作为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> }

信号与槽步骤及参数理解

声明信号与槽 signals: 信号声明; //只有声明,不需要实现,需使用emit发送信号 public/private slots: 槽函数; //必须实现 实现槽函数 void Widget::printText() { ...... }

3.连接信号与槽(两种方法)

QObject::connect(发送信号的对象地址,信号SIGNALS(...),接收信号对象地址,槽函数SLOT(...)); //一个信号可以连接到多个槽,多个信号也可以连接到一个槽 //新的连接信号和槽的方法: QObject::connect(发送信号的对象地址,&类名::信号名,接收信号对象地址,&类名::槽函数名);

信号与槽偏语法(不常用)

断开信号和槽 QObject::disconnect(参数和connect完全一致); //断开信号和槽的函数不常用, //当对象销毁后,Qt自动断开所有和该对象的连接。 信号的连接/传递 一个信号可以连接另一个信号,当一个信号发射之后触发另一个信号,信号可以用这种方式传递下去。 connect(对象a,SIGNAL(t(...)),对象b,SIGNAL(t(....)));

信号与槽使用注意事项

信号

信号使用signals关键字声明,不添加修饰符,默认是public,参考上面案例;信号只需声明,不需实现,可以传参数,实现过程酷似函数,但其调用方式不同,信号需要使用emit关键字发送;如 emit func(1);不能对信号进行定义,信号是由moc自动生成的;信号只能返回void类型。

声明槽需要使用slots关键字,且需要添加访问权限,如public:;槽不同于普通函数于他可以与信号关联,平常使用与普通函数无异。

两者的联系

槽的参数不能多于信号的参数,如槽接收不到全部参数,函数内部则会产生多余参数的运算,导致结果错误,所以信号槽的参数的类型及个数要等于信号参数的类型;若信号的参数多余槽的参数,则多余的参数将被忽略;一个信号可以关联多个槽,多个信号也可以关联同一个槽,信号也可以关联到另一个信号上;当一个信号关联多个槽时,则发送信号时,槽函数按照关联的顺序依次执行;当信号关联另一个信号,则第一个信号发送时,会立即发送第二个信号;信号与槽可以使用Qt内部预定义的,也可以自己定义。参数对应

案例

使用系统预定义的click信号,通过点击按钮,改变窗口文字的颜色;使用自定义信号与槽,向槽发送一个信号,并打印。

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_H

widget.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(); }
最新回复(0)