非Qt工程使用Qt的信号槽机制
非Qt工程,使用Qt的信号槽机制,蛋疼不?反正我现在就是要做这样一件蛋疼的事。
要使用Qt的信号槽机制,下面是从Qt Assist里面关于 signal & slots 的一句介绍:
All classes that contain signals or slots must mention Q_OBJECT at the top of their declaration. They must also derive (directly or indirectly) from QObject.
翻译过来就是:所有包含信号与槽的类,必须引用 Q_OBJECT这个宏,然后需要从QObject继承过来。
这样得到我们要做事情的前2个步骤:
1. 从QObject继承。
2. 类中引用 Q_OBJECT这个宏。
我打算在A类里面发出一个信号,然后让B类接收。
//A.h的内容
#pragma once
#include <QtCore/QObject>
class A :public QObject
{
Q_OBJECT
public:
void sendA() { emit signalA(999);}
signals:
void signalA(int);
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
//B.h 的内容
#pragma once
#include <QtCore\QObject>
class B : public QObject
{
Q_OBJECT
public:
B() : _receiveData(0)
{
}
public slots:
void receiveA(int v)
{
_receiveData = v;
}
public:
int _receiveData;
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
做完这两件事情之后,编译不通过啊,怎么办?关于头文件,LIB文件的包含,这里不讲了。
这里引用到了QtCore/QObject这个头文件, Qt5Cored.lib(根据版本不同,名称不一样)这个库。
- 由于Q_OBJECT这个宏是由moc来处理的,还需要使用moc对我们的头文件进行编译。由于不是Qt工程,所以这个编译需要手动设置一下,具体参考下面
http://blog.csdn.net/xiaofengkuang/article/details/9999147
使用moc编译完了之后,然后再讲moc_A.cpp, moc_B.cpp添加到工程中来即可。
测试代码:
#include "A.h"
#include "B.h"
#include <assert.h>
#include <QtCore/QObject>
int main(int argc, char **argv)
{
A a;
B b;
QObject::connect(&a, SIGNAL(signalA(int)), &b, SLOT(receiveA(int)));
a.sendA();
int data = b._receiveData;
assert(data == 999);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
测试通过。
所以,总结一下非Qt工程,使用Qt的信号槽的步骤:
1. 继承自QObject
2. 引用Q_OBJECT宏
3. 使用Qt的moc编译头文件,并将编译完成之后的moc_*.cpp文件添加到工程中来。
当然,这过程中,你引用到的Qt头文件,lib文件,都需要你手动指定好路径和依赖库。
https://blog.csdn.net/snail_hunan/article/details/48634427
非Qt工程使用Qt的信号槽机制的更多相关文章
- QT写hello world 以及信号槽机制
QT是一个C++的库,不仅仅有GUI的库.首先写一个hello world吧.敲代码,从hello world 写起. #include<QtGui/QApplication> #incl ...
- QT学习记录之理解信号槽机制
作者:朱金灿 来源:http://blog.csdn.net/clever101 QT的事件机制采用的信号槽机制.所谓信号槽机制,简而言之就是将信号和信号处理函数绑定在一起,比如一个按钮被单击是一个信 ...
- Qt 学习之路 :信号槽
信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被 ...
- QT信号槽机制
信号槽 信号槽是QT中用于对象间通信的一种机制,也是QT的核心机制.在GUI编程中,我们经常需要在改变一个组件的同时,通知另一个组件做出响应.例如: 一开始我们的Find按钮是未激活的,用户输入要查找 ...
- C++11实现Qt的信号槽机制
概述 Qt的信号槽机制是Qt的核心机制,按钮点击的响应.线程间通信等都是通过信号槽来实现的,boost里也有信号槽,但和Qt提供的使用接口很不一样,本文主要是用C++11来实现一个简单的信号槽,该信号 ...
- VJGUI消息设计-兼谈MFC、QT和信号/槽机制
星期六下午4点,还在公司加班.终于写完了下周要交工的一个程序. 郁闷,今天这几个小时写了有上千行代码吧?虽然大部分都是Ctrl-C+Ctrl-V,但还是郁闷. 作为一个有10年经验的MFC程序员,郁闷 ...
- Qt计算器开发(二):信号槽实现数学表达式合法性检查
表达式的合法性 由于我们的计算器不是单步计算的,所以我们能够一次性输入一个长表达式.然而假设用户输入的长表达式不合法的话,那么就会引发灾难.所以有必要对于用户的输入做一个限制. 一些限制举例: 比方, ...
- Qt学习记录--02 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)
一 闲谈: 熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说:一切皆消息.它可以很方便实现不同窗体之间的通信,然而MFC库将很多底层的消息都屏蔽了,尽管使用户更加方便.简易地处理消息,但 ...
- Qt开发之信号槽机制
一.信号槽机制原理 1.如何声明信号槽 Qt头文件中一段的简化版: class Example: public QObject { Q_OBJECT signals: void customSigna ...
随机推荐
- vmware笔试题目
http://discuss.acmcoder.com/topic/58db8e2ebb0f44ba0e94e670 上面是完整的题目,下面一下我自己的想法. http://discuss.acmco ...
- vue项目中阻止浏览器返回上一页
vue项目中在某个页面阻止浏览器返回上一页,适用移动端.PC端. 使用场景例如: 首页 与 A页面 来回跳转,那样点击浏览器返回时也会来回跳转,本想当页面在首页的时候就不再返回了,所以这个时候 ...
- C#控制台显示进度条
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Prog ...
- C#服务控件UpdatePanel的局部刷新与属性AutoPostBack回传
C#服务控件许多都有AutoPostBack这一属性(AutoPostBack意思是自动回传,也就是说此控件值更改后是否和服务器进行交互),如下代码所示: protected void Textbox ...
- Redis之Ubuntu下Redis集群搭建
安装redis 首先下载redis $ wget http://download.redis.io/releases/redis-4.0.10.tar.gz $ .tar.gz $ cd redis- ...
- SurfaceView加载长图
1:SurfaceView加载长图,移到.可以充当背景 效果截图 2:View (淡入淡出动画没实现:记录下) package com.guoxw.surfaceviewimage; import a ...
- 重载(overload)和重写(override)的对比(笔试经常出)
Day04_SHJavaTraing_4-6-2017 1.重载(overload): ①权限修饰符(public private 默认): 无关 ②返回值类型: ...
- DDoS攻击与防范策略
DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是目前最强大.最难防御的攻击之一. 按照发起的方式 ...
- 为my_string类创建复制构造函数copy constructor ,拷贝函数名和类同名
为下面的my_string类创建一个复制构造函数,并将定义该类的代码提交. my_string类的定义: class my_string { char *s; public: my_string(ch ...
- nginx 自动填充index.php
if (!-e $request_filename) { rewrite ^/(.+?\.php)/?(.*)$ /$/$ last; rewrite ^/(.*)$ /index.php/$ las ...