Sirius' blog Sirius' blog
首页
  • 学习笔记

    • 《C++》
    • 《MATLAB》
    • 《Python》
  • 学习笔记

    • 《Git》
    • 《CMake》
  • 技术文档
  • 博客搭建
  • 学习
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Sirius0v0

怕什么真理无穷,进一寸有一寸的欢喜
首页
  • 学习笔记

    • 《C++》
    • 《MATLAB》
    • 《Python》
  • 学习笔记

    • 《Git》
    • 《CMake》
  • 技术文档
  • 博客搭建
  • 学习
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Qt安装与配置
  • 信号槽
    • 自定义信号槽
    • 信号槽的连接方式
      • 连接『重载』的信号和槽
    • 信号和槽的相互连接
    • 断开连接disconnect
  • QWidget控件
  • 其它控件的使用
  • 《Qt》学习笔记
Sirius0v0
2024-03-04
目录
自定义信号槽
信号槽的连接方式
连接『重载』的信号和槽
信号和槽的相互连接
断开连接disconnect

信号槽

# 信号槽

信号的本质是函数,只需声明,无需实现;槽(槽函数)通常需要执行信号对应的操作。信号和槽需要使用connect函数进行连接。

connect函数的一般形式如下:

connect(sender, signal, receiver, slot);

其中,

  • sender:发出信号的对象
  • signal:发出的信号
  • receiver:接收信号的对象
  • slot:接收信号后调用的函数

# 自定义信号槽

自定义信号和槽的条件:

  • 自定义的类,要继承自QObject
  • 自定义的类,其中要声明一个宏Q_OBJECT

自定义信号的方法: 在signals下添加自定义信号即可,返回值为void:

class X : public QObject {
  Q_OBJECT

 public:
  X(QObject *parent = nullptr);
  ~X();

 signals:
  void my_signal();
  void my_signal(double arg);
};

自定义槽的方法: 槽函数应与信号的返回值保持一致。

class Person : public QObject {
  Q_OBJECT

 public:
  Person(QObject *parent = nullptr);
  ~Person();

 public slots:
  void eat();
  void eat(double arg);
};

# 信号槽的连接方式

  • SIGNAL/SLOT(Qt4)
  • 函数地址(Qt5)
  • UI 设计师界面 - 转到槽(仅QtCreator)
  • UI 设计师界面 - 信号槽编辑器
  • lambda 表达式

在Qt4中连接信号和槽的方法:

connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

在Qt5中连接信号和槽的方法:

connect(sender, &Sender::signal, receiver, &Receiver::slot);

# 连接『重载』的信号和槽

Qt4中写法较为简单:

connect(&reason_, SIGNAL(reason()), &eat_, SLOT(go()));
connect(&reason_, SIGNAL(reason(std::wstring)), &eat_,
        SLOT(go(std::wstring)));

Qt5中需要单独定义函数指针:

void (Reason::*no_reason)() = &Reason::reason;
void (Eat::*no_reason_go)() = &Eat::go;
connect(&reason_, no_reason, &eat_, no_reason_go);

void (Reason::*have_reason)(std::wstring) = &Reason::reason;
void (Eat::*have_reason_go)(std::wstring) = &Eat::go;
connect(&reason_, have_reason, &eat_, have_reason_go);

# 信号和槽的相互连接

1. 一个信号可以连接多个槽函数

connect(sender, SIGNAL(signal), receiver1, SLOT(fun1()));
connect(sender, SIGNAL(signal), receiver2, SLOT(fun2()));

Qt4执行槽函数随机,Qt5+执行槽函数顺序与建立连接顺序一致

2. 多个信号可以连接同一个槽函数

3. 信号可以连接信号

# 断开连接disconnect

sender.disconnect();
编辑 (opens new window)
#Qt
Qt安装与配置
QWidget控件

← Qt安装与配置 QWidget控件→

最近更新
01
ipopt优化库配置及使用
07-21
02
ubuntu离线安装包的方法
07-21
03
其它控件的使用
03-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 Sirius0v0 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式