非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(根据版本不同,名称不一样)这个库。

  1. 由于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的信号槽机制的更多相关文章

  1. QT写hello world 以及信号槽机制

    QT是一个C++的库,不仅仅有GUI的库.首先写一个hello world吧.敲代码,从hello world 写起. #include<QtGui/QApplication> #incl ...

  2. QT学习记录之理解信号槽机制

    作者:朱金灿 来源:http://blog.csdn.net/clever101 QT的事件机制采用的信号槽机制.所谓信号槽机制,简而言之就是将信号和信号处理函数绑定在一起,比如一个按钮被单击是一个信 ...

  3. Qt 学习之路 :信号槽

    信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被 ...

  4. QT信号槽机制

    信号槽 信号槽是QT中用于对象间通信的一种机制,也是QT的核心机制.在GUI编程中,我们经常需要在改变一个组件的同时,通知另一个组件做出响应.例如: 一开始我们的Find按钮是未激活的,用户输入要查找 ...

  5. C++11实现Qt的信号槽机制

    概述 Qt的信号槽机制是Qt的核心机制,按钮点击的响应.线程间通信等都是通过信号槽来实现的,boost里也有信号槽,但和Qt提供的使用接口很不一样,本文主要是用C++11来实现一个简单的信号槽,该信号 ...

  6. VJGUI消息设计-兼谈MFC、QT和信号/槽机制

    星期六下午4点,还在公司加班.终于写完了下周要交工的一个程序. 郁闷,今天这几个小时写了有上千行代码吧?虽然大部分都是Ctrl-C+Ctrl-V,但还是郁闷. 作为一个有10年经验的MFC程序员,郁闷 ...

  7. Qt计算器开发(二):信号槽实现数学表达式合法性检查

    表达式的合法性 由于我们的计算器不是单步计算的,所以我们能够一次性输入一个长表达式.然而假设用户输入的长表达式不合法的话,那么就会引发灾难.所以有必要对于用户的输入做一个限制. 一些限制举例: 比方, ...

  8. Qt学习记录--02 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)

    一 闲谈: 熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说:一切皆消息.它可以很方便实现不同窗体之间的通信,然而MFC库将很多底层的消息都屏蔽了,尽管使用户更加方便.简易地处理消息,但 ...

  9. Qt开发之信号槽机制

    一.信号槽机制原理 1.如何声明信号槽 Qt头文件中一段的简化版: class Example: public QObject { Q_OBJECT signals: void customSigna ...

随机推荐

  1. php对文件/目录操作的基础知识(图解)

    具体的如下图所示:

  2. java网络通信编程

    网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴.在发送和接收数据时,大部分的程序设计语言都设 ...

  3. [hihocoder][Offer收割]编程练习赛48

    折线中点 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #includ ...

  4. Codeforces Round #448

    Pizza Serparation #include<stdio.h> #include<string.h> #include<stdlib.h> #include ...

  5. Android 接入微信分享错误码-6

    官方的常见错误表示签名出错登录以后,需要重装微信(也就是清除微信本地数据)

  6. 【Oracle】ORA-01157: cannot identify/lock data file 201 - see DBWR trace file

    今天数据库在查询数据的时候显示了这个错误: ORA-01157: cannot identify/lock data file 201 - see DBWR trace file ORA-01110: ...

  7. element-ui Cascader 级联选择器示例

    <html> <head>test</head> <style> @import url("http://unpkg.com/element- ...

  8. 【技术累积】【点】【java】【2】聊一聊似曾相识的switch语句

    闲聊 有些东西并不能像爱因斯坦老先生说的那样,书上查的到就不用去记住... 开始 java使用了C的所有流程控制语句: java中同样有switch语句: 大多数情况下,switch都可以用if替换: ...

  9. oracle AWR详解

    原文地址:https://blog.csdn.net/elvis_lfc/article/details/52326148 啥是AWR? =============================== ...

  10. concurrent.futures 学习笔记

    concurrent.futures 先看下官方介绍 The asynchronous execution can be performed with threads, using ThreadPoo ...