【北京迅为】iTOP-4412全能版使用手册-第七十三章 Qt信号和槽

iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、陀螺仪、CAN总线、RS485总线、500万摄像头等模块,稳定运行Android 4.0.3/Android 4.4操作,系统通用Linux-3.0.15+Qt操作系统(QT支持5.7版本),Ubuntu版本:12.04,接口智能分配 方便好用。


第七十三章 Qt信号和槽

信号就是指控件发出的特定的信号。槽就是槽函数的意思,信号和槽都位于类中,不是C++标准代码。我们可以把槽函数绑定在某一个控件的信号上。当需要调用外部函数时,发送一个信号,此时与该信号相关联的槽便会被调用,槽其实就是一个函数,槽与信号的关联要由程序员来完成,关联方法有自动关联和手动关联。

73.1 自动关联

使用Qt信号和槽的自动关联,可加快开发速度,一般用于同一个窗体之间的控件关联,槽函数格式非常关键,格式为:

void on_<窗口部件名称>_<信号名称>(<signal parameters>);

自动关联步骤:

步骤一:手动选择相应的控件,然后右键->转到槽。

选择信号类型:

自动关联会在.h文件声明槽函数。槽函数只能声明到private slots或者public slots 下面。按住Ctrl+鼠标左键,跳转到.cpp文件对应的函数功能实现部分。填写功能代码,我们在槽函数内用qDebug打印信息。

保存,点击构建,运行:

每次点击,按钮都会发信号,对应的槽函数就会执行,结果如图:

73.2 手动关联

信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。此外如果遇到不懂的函数或类,可以先选中,然后按F1键,即可查看介绍。

虽然Qt有自动关联功能,但涉及到多个窗体和复杂事件的时候,只能使用手动关联,手动关联使用connect这个函数。

connect(const QObject *sender, const char *signal,

const QObject *receiver, const char *member,

Qt::ConnectionType = Qt::AutoConnection);

通常只传递前四个参数,参数含义:

sender:发送对象;

singal:发送对象里面的一个信号,格式一般为SIGNAL(信号);

receiver:接收对象;

member:接收对象里面的槽函数,格式一般为SLOT(信号)。

ConnectionType:设置信号和槽的同步异步,一般使用默认值Qt::AutoConnection,可 不填。

connect(A,SIGNAL(B),C,SLOT(D));

当对象A发出B信号时候,就

会触发对象C的槽函数D

signals 是 QT 的关键字,而非 C/C++ 的。signals 关键字指出进入了信号声明区,随后即可声明自己的信号。

slots 槽是普通的 C++ 成员函数,当与其关联的信号被发射时,这个槽函数就会被调用。槽函数有的参数个数和类型,在对应的信号函数中必须一一对应,即信号函数的参数个数必须多于或等于槽函数的个数。

emit Qt定义的一个宏,作用是发射信号,与此信号关联的槽函数就会被调用。

例程:我们在widget.h中自定义一个信号和一个槽函数

并在widget.cpp实现槽函数:

然后在widget.cpp中绑定信号和槽:

在widget.ui中创建按钮,并转到槽,自动关联的槽函数如图:

发射信号

这样,点击按钮,就会发射自定义的信号my_Signal(),与my_Signal()相关联的this对象槽函数my_Solt就会被调用,槽函数就会输出打印信息,如图:

部分核心代码如下:

Widget.h:

class student
{
public:
       student();
       ~student();
       char name[64];
       int age;
 
       void test();
       void test(int a);
#include <QWidget>
 
namespace Ui {
class Widget;
}
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
signals:
    void my_Signal(void);   //自定义的信号
 
private slots:
    void on_pushButton_clicked();
    void my_Solt(void);     //自定义的槽函数
 
private:
    Ui::Widget *ui;
};

Widget.cpp:

#include "widget.h"
#include "ui_widget.h"
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(this,SIGNAL(my_Signal()),this,SLOT(my_Solt()));
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::on_pushButton_clicked()
{
    emit my_Signal();
}
void Widget::my_Solt(void)
{
    qDebug("按下");
}
相关推荐
LuckyLay9 分钟前
Linux网络知识——路由表
linux·服务器·网络·路由·ip route
刘泽美34 分钟前
Ubuntu/centOS 如何安装 OpenGL
linux·运维·ubuntu
kucupung1 小时前
【编译构建】用cmake编译libjpeg动态库并实现转灰度图片
linux·c++
釉色清风1 小时前
【Linux】常见指令(一)
linux·运维·服务器
honey ball1 小时前
过压保护电路
单片机·嵌入式硬件
扛枪的书生1 小时前
Linux 提权指南
linux·渗透·kali·提权
北京迅为2 小时前
【北京迅为】iTOP-4412全能版使用手册-第七十七章 Qt串口编程
linux·嵌入式硬件·4412开发板
二当家的素材网2 小时前
SDK调用文心一言如何接入,文心一言API接入教程
linux·运维·服务器
Jack153027682793 小时前
高性能、低成本立体声音频模数转换器—— GC1808,支持掉电和时钟检测低功耗模式
单片机·嵌入式硬件·fpga开发·制造·蓝牙·家庭影院·麦克风阵列处理器
carl.xu3 小时前
ubuntu Android : adb logcat 过滤多个log
android·linux·adb