信号与槽
1.概述

​ 信号和槽机制是 Qt 的核心机制,信号和槽是一种高级接口,应用于对象之间的通信,它是 Qt 的核心特性,也是 Qt 区别于其他工具包的重要地方。信号和槽是 Qt 自行定义的一种通信机制,它独立于标准的 C/C++ 语言,因此要正确的处理信号和槽,必须借助一个呗称为 moc (Meta Object Compiler) 的 Qt 工具,该工具是个 C++ 预处理程序,它为高层次的事件处理自动生成所需要的附加代码。

​ 在我们所熟知的非常多的 GUI 工具包中,串口小部件(wedget)都有一个回调函数,用于响应他们能触发的每个动作,这个回调函数通常都是指向某个函数的指针。不过,在 Qt 中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生 core dups。

​ 所有从 QObject 或其子类(例如 QWidget)派生的类都能够包含信号和槽。当对象改动其状态时,信号就由该对象发射(emit)出去,这就是真正的信息封装,它确保对象被当做一个真正的软件组件来使用。槽用于接收信号,但他们是普通的对象成员函数。一个槽并不知道是否有信号和自己连接。而且对象并不了解具体的通信机制。

​ 你能将非常多的信号和单个槽进行连接,也能将单个信号和非常多的槽进行连接,甚至于将一个信号和另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将及时发射第二个信号。总之,信号和槽构造了一个强大的部件编程机制。

2. 信号

​ 当某个信号对其客户或所有者的内部状态发生改动,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。但一个信号被发射时,和其相关联的槽将被即时执行,就像一个正常的函数调用一样。信号-槽机制完全独立于所有的 GUI 事件循环。只有当所有的槽返回以后发射函数(emit)才返回。如果存在多个槽和某个信号相关联,那么当这个信号被发射时,这些槽将会一个接一个地执行,不过他们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行,哪个后执行。

​ 信号的声明是在头文件中进行的,Qt 的 signals 关键字指出进入了信号声明区,随后即可声明自己的信号。例如,下面定义了三个信号:

signals:
void mySignal;
void mySignal(int x);
void mySignalParam(int x, int y);

​ 在上面的定义中,signals 是 Qt 的关键字,而非 C/C++ 的。接下来一行的 void mySginal 定义了信号 mySignal,这个信号没有携带参数;接下来的一行 void mySignal(int x) 定义了重名信号 mySginal,不过他携带一个整形参数,这有点类似于 C++ 的虚函数。从形式上讲信号的声明和普通的 C++ 函数声明是相同的,不过信号却没有函数体定义,另外,信号的返回值都是 void,不要指望能从信号返回什么有用信息。

​ 信号由 MOC 自动产生,他们不应该在 .cpp 文件中出现。

3. 槽

​ 槽是普通 C++ 成员函数,能被正常调用,他们唯一的特别性就是非常多信号能和其相关联。当和其关联的信号被发射时,这个槽就会被调用。槽能有参数,但槽的参数不能有缺省值。

​ 既然槽是普通的成员函数,因此他其他的函数相同,他们也有存取权限。槽的存取权限决定了谁能够和其相关联。同普通的 C++ 成员函数相同,槽函数也分为三种类型,即 public slots、private slots和 protected slots。

public slots: 在这个区内声明的槽意味着所有对象都可将信号与之连接。这对应组件编程非常有用。你能创建彼此互不了解的对象,经他们的信号和槽进行连接以便信息能够正确地传递。
protected slots: 在这个区内声明的槽意味着当前类及其子类能将消息与之相连接。这适用于那些槽 —— 他们是类实现的一部分,不过其界面接口却面向外部。
private slots: 在这个区内声明的槽意味着只有类自己能将信号与之相连接。着适用于联系非常紧密的类。

​ 槽也能够声明为虚函数,这也是非常有用的。

​ 槽的声明也是在头文件中进行的。例如,下面声明了三个槽:

public slots:
void mySlot;
void mySlot(int x);
void mySlotParam(int x, int y);
4.信号和槽的关联

​ 通过调用 QObject 对象的 connect 函数来将某个对象的信号和另外一个对象的槽函数相关联,这样当发射者发射信号时,接受者的槽函数将被调用。该函数的定义如下:

bool QObject::connect(const QObject* sender, const char* signal, const QObject* receiver, const char* member) [static]

​ 这个函数的作用就是将发射者 sender 对象中的信号 signal 和接受者 receiver 中单的 member 槽函数关联起来。当指定信号 signal 时必须使用 Qt 的宏 SIGNAL,当指定槽函数时必须使用 SLOT。如果发射者和接受属于同一个对象的话,那么在 connect 调用中接收者参数能省略。

QLabel* label = new QLabel;
QScrollBar* scroll = new QScrollBar;
QOBject::connect(scroll, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)));

​ 一个信号甚至能够和另一个信号相关联。

class MyWidget:public QWidget
{
public:
MyWidget;
...
signals:
void aSignal;
...
private:
QPushButton* aButton;
};
MyWidget::Muwidget
{
aButton = new QPushButton(this);
connect(aButton, SIGNAL(clicked), SIGNAL(aSignal));
}

​ 在上面的构造函数中,MyWidget 创建了一个私有的按钮 aButton, 按钮的单击事件产生的信号 clicked 和另外一个信号 aSignal 也接着被发射。当然,也可以直接将单击事件和某个私有的槽函数相关联,然后在槽中发射 aSignal 信号,这样的话似乎有点多余。

​ 当信号和槽 没有必要继续保持关联时,我们能使用 disconnect 函数来断开连接。其定义如下:

bool QObject::disconnect(const QObject* sender, const char* signal, const Object* receiver, const char* member) [static]

​ 这个函数断开发射者中的信号和接收者中槽函数之间的关联。有三种情况必须使用 disconnect 函数。

(1)断开和某个对象相关联的所有对象。这似乎有点不可理解,事实上,当我们在某个对象中定义了一个或多个信号时,这些信号和另外若干个对象中的槽相关联,如果我们要切断这些关联的话,就能利用这个方法,非常之简洁。

disconnect(myObject, 0, 0, 0);
或者
myObject->disconnect;

(2)断开和某个特定信号的所有关联。

disconnect(myObject, SIGNAL(mySignal), 0, 0);
或者
myObject->disconnect(SIGNAL(mySignal));

(3)断开两个对象之间的关联

disconnect(myObject , 0, myReceiver, 0);
或者
myObject->disconnect(myReceiver);

​ 在 disconnect 函数中 0 能用作一个通配符,分别表示所有信号、所有接受对象、接受对象中的所有槽函数。不过发射者 sender 不能为 0,其他三个参数的值都能等于 0 。

5. 信号槽如何传递参数

​ 利用 Qt 进行程序开发时,有时需要信号槽来 完成参数传递。带参数的信号槽在使用时,有几点需要注意的地方。

(1)当信号与槽函数的参数数量相同时,它们的参数类型要完全一致。

//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow> namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow(); private:
Ui::MainWindow *ui; signals:
//自定义信号
void iSignal(int b); private slots:
//自定义槽函数
void iSlot(int b);
void on_pushButton_clicked();
}; #endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug> MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//信号与槽的绑定
connect(this, SIGNAL(iSignal(int)), this, SLOT(iSlot(int)));
} MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::iSlot(int b)
{
qDebug() << b;
} void MainWindow::on_pushButton_clicked()
{
emit iSignal(500);
}

​ 运行,点击按钮,则打印出传入的参数。

aaarticlea/png;base64,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" alt="image">

(2)当信号的参数与槽函数的参数数量不同时,只能是信号的参数数量多于槽函数的参数数量,且前面相同数量的参数类型应一致,信号中多于的参数会被忽略。

//信号
void iSignal(int a, float b);
//槽
void MainWindow::iSlot(int b)
{
qDebug(b);
}
//信号槽绑定
connect(this, SIGNAL(iSignal(int, float)), this, SLOT(iSlot(int)));
//发送信号
emit iSigal(5, 0.3);
//结果打印出“5”

(3)此外,在不进行参数传递时,信号槽绑定时也是要求信号的参数数量大于等于槽函数的参数数量。这种情况一般是一个带参数的信号去绑定一个屋参数的槽函数。

//信号
void iSignal(int a, float b);
//槽
void MainWindow::iSlot
{
QString qString = "Hello world!";
qDebug(qString);
}
//信号槽绑定
connect(this, SIGNAL(iSignal(int, float)), this, SLOT(iSlot));
//发送信号
emit iSigal(5, 0.3);
//结果打印出“Hello world!”

02Qt信号与槽(1)的更多相关文章

  1. QT学习日记篇-02-QT信号和槽

    课程大纲: <1>给控件改名字 随着UI界面的控件变多,如果使用系统自带的名称,后期会让人不明觉厉,说白了,就是掌握C++的命名规则:易懂,条例清晰,人性化 方法:直接点击控件,进入右侧对 ...

  2. qt5中信号和槽的新语法

    qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...

  3. Qt信号与槽自动关联机制

    参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...

  4. pyqt信号和槽应用举例

    第一篇手写随笔. 项目的部分代码: 在子线程中改变主窗体的标签. class MyForm(QDialog): def __init__(self, parent=None): self.config ...

  5. 在Qt Creator 和在 vs2012 里添加信号和槽

    原文地址:http://www.cnblogs.com/li-peng/p/3644812.html 作者:李鹏 出处:http://www.cnblogs.com/li-peng/ 本文版权归作者和 ...

  6. QT点击"X"按钮,调用closeEvent()函数来实现调用特定事件(附:粗略介绍QT的信号与槽的使用方法)

    背景: QT在用户关闭窗口(直接点击"X"键)时,程序一般都需要做一些善后的事情,就我现在的程序来说,既关闭USB.如何实现? 正文: 首先,在对应窗体的".h" ...

  7. QT 信号与槽connect

    QT 信号与槽connect QT 信号与槽connect connect函数调用几个限制 connect函数代码 QT中信号与槽的连接使用的connect函数是一个静态函数,在类QObject中定义 ...

  8. Qt之自定义信号和槽函数

    自定义信号和槽函数: 1.类的声明和实现分别放在.h和.cpp文件中: 2.类声明包含Q_OBJECT宏: 3.信号只要声明不要设计其的实现函数 4.发射信号用emit关键字 5.自定义槽的实现与普通 ...

  9. Qt信号与槽应用实例一

    ..... connect(m_pGlobelWidget,signal(globeControlClick(object,object)),this,slot(globeControlClick(o ...

随机推荐

  1. 位运算>>和>>>区别

    int a=-1; Integer b=0; Integer c=0; System.out.println(Integer.toBinaryString(a)); b=a>>1; c=a ...

  2. 引入clipboard.js

    引入clipboard.js var clipboardJS = new ClipboardJS('#accept-data'); // 括号内的是选择器

  3. 什么是微服务架构,.netCore微服务选型

    什么是微服务架构,.netCore微服务选型 https://www.cnblogs.com/uglyman/p/9182485.html 开发工具:VS2017 .Net Core 2.1 什么是微 ...

  4. javac 找不到文件 的可能原因

    初学Java还不太明白,竟在些简单的事情上栽跟头,分享一下省的麻烦. 当我们配置好JDK和环境变量之后,在命令行下输入javac,说明我们的安装是正确的.

  5. 复习KMP

    KMP刚学的时候,看不懂. 再看,哇!原来是这样! 用的时候,忘了. 为了不再跌倒,我决定,记住吧... 在我看来,KMP一般用于字符串匹配时的防超时优化. 他的精髓就是,利用已经匹配的信息,简化这之 ...

  6. c#进行MD5加密方式和解密算法

    --------------- 因为加密个解密都需要用到key所有在加密的后需要把key和加密码都存到数据库中 /// <summary> /// 唯一加密方式 /// </summ ...

  7. Java基础知识 ——JDK,JRE和JVM

    1.开发简单的Java程序过程: 名词解释: JDK:JDK是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心,它包含了JAVA的运行 ...

  8. AngularJS(六):表单-复选框

    本文也同步发表在我的公众号“我的天空” 复选框 复选框只有两个值:true或者false,因此在AngularJS中,一般都是将复选框的ng-model绑定为一个布尔值属性,通过这两个布尔值来决定其勾 ...

  9. dstat工具使用介绍

    一.dstat工具多功能系统资源统计生成工具.获取信息类似top.free.iostat.vmstat等多个工具的合集,所以也称为vmstat.iostat.ifstat等工具替代品,其结果可以存储成 ...

  10. MySQL数据库详解(三)MySQL的事务隔离剖析

    提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务.最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱. 转账过程具体到程序里会有一系列的操作,比如 ...