QT——信号槽
结合教程,写出如下关于信号槽的代码,将教程中信号槽两种方式写入同一个界面中。
#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QDebug>
#include <QHBoxLayout> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//MainWindow w;
//w.show(); QWidget *myWidget = new QWidget;
myWidget->setWindowTitle("Hello World"); //信号槽
QPushButton *button0 = new QPushButton;
button0->setText("Quit");
QObject::connect(button0, &QPushButton::clicked, &QApplication::quit);
// Lambda表达式标准输出
QPushButton *button = new QPushButton;
button->setText("std::out");
QObject::connect(button, &QPushButton::clicked, [](bool) {
qDebug() << "You clicked me!";
}); QHBoxLayout *layout = new QHBoxLayout;
//layout->addItem(button0);
layout->addWidget(button0);
layout->addWidget(button);
myWidget->setLayout(layout); myWidget->show(); return a.exec();
}
Qt5中信号槽的定义:
QMetaObject::Connection connect(const QObject *, const char *,
const QObject *, const char *,
Qt::ConnectionType); QMetaObject::Connection connect(const QObject *, const QMetaMethod &,
const QObject *, const QMetaMethod &,
Qt::ConnectionType); QMetaObject::Connection connect(const QObject *, const char *,
const char *,
Qt::ConnectionType) const; QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
const QObject *, PointerToMemberFunction,
Qt::ConnectionType) QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
Functor);
connect()一般会使用前面四个参数,第一个是发出信号的对象,第二个是发送对象发出的信号,第三个是接收信号的对象,第四个是接收对象在接收到信号之后所需要调用的函数。也就是说,当 sender 发出了 signal 信号之后,会自动调用 receiver 的 slot 函数。
connect(sender, signal, receiver, slot);
自定义信号槽:
//newspaper.h #ifndef NEWSPAPER_H
#define NEWSPAPER_H #include <QObject> //使用信号槽必须继承QBject类
class Newspaper : public QObject
{
//QBject类及其子类,都必须在第一行写Q_OBJECT
//该宏应放于头文件中
Q_OBJECT
public:
Newspaper(const QString & name) :
m_name(name)
{
} void send()
{
//emit 的含义是发出newPaper()的信号
emit newPaper(m_name);
} //信号函数,返回值为void,参数是类要让外界获取的数据
signals:
void newPaper(const QString &name); private:
QString m_name;
};
#endif // NEWSPAPER_H
//reader.h #ifndef READER_H
#define READER_H #include <QObject>
#include <QDebug> class Reader : public QObject
{
Q_OBJECT
public:
Reader() {} //槽函数
void receiveNewspaper(const QString & name)
{
qDebug() << "Receives Newspaper: " << name;
}
}; #endif // READER_H
#include "mainwindow.h"
#include "newspaper.h"
#include "reader.h"
#include <QApplication>
#include <QPushButton>
#include <QDebug>
#include <QHBoxLayout> int main(int argc, char *argv[])
{ QCoreApplication app(argc, argv);
//MainWindow w;
//w.show(); Newspaper newspaper("Newspaper A");
Reader reader;
//信号连接机制
QObject::connect(&newspaper, &Newspaper::newPaper,
&reader, &Reader::receiveNewspaper);
newspaper.send(); return app.exec(); }
编译文件,报错——LNK2001,无法链接解析的外部符号。
解决方法:将Project的同级编辑文件删除,重新编译既可。
输出:
QT——信号槽的更多相关文章
- Qt信号槽的一些事(第一次知道信号还有返回值,以及Qt::UniqueConnection)
注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...
- QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类
一般情况下信号槽直接连接方式不会出现问题,但是如果信号与槽在不同线程或Qt::QueuedConnection方式连接,可能会在连接期间报以下类似问题,如: QObject::connect: Can ...
- QT信号槽详解
1 QT信号槽详解 1.1 信号和槽的定义 信号是触发信号,例如按钮的点击触发一个clicked信号,槽是用来接收信号,并处理信号,相当于信号响应函数.一个信号可以关联多个槽函数,信 ...
- Qt信号槽的一些事 Qt::带返回值的信号发射方式
一般来说,我们发出信号使用emit这个关键字来操作,但是会发现,emit并不算一个调用,所以它没有返回值.那么如果我们发出这个信号想获取一个返回值怎么办呢? 两个办法:1.通过出参形式返回,引用或者指 ...
- Qt信号槽的一些事
注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...
- QT源码之Qt信号槽机制与事件机制的联系
QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容. 本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConne ...
- Qt信号槽-原理分析
目录 一.问题 二.Moc 1.变量 2.Q_OBJECT展开后的函数声明 3.自定义信号 三.connect 四.信号触发 1.直连 2.队列连接 五.总结 六.推荐阅读 一.问题 学习Qt有一段时 ...
- Qt信号槽源码剖析(一)
大家好,我是IT文艺男,来自一线大厂的一线程序员 大家在使用Qt开发程序时,都知道怎么使用Qt的信号槽,但是Qt信号槽是怎么工作的? 大部分人仍然不知道:也就是说大家只知道怎么使用,却不知道基于什么原 ...
- Qt信号槽源码剖析(二)
大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的基本概念.元对象编译器.示例代码以及Qt宏:今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频. Qt信号槽的宏 ...
- (文字版)Qt信号槽源码剖析(三)
大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的Qt宏展开推导:今天接着深入分析,进入Qt信号槽源码剖析系列的第三节视频. Qt信号槽宏推导归纳 #define si ...
随机推荐
- Android hide Navigation bar
最近一个app需要隐藏Navigation bar导航栏. 参考文档 http://blog.csdn.net/zwlove5280/article/details/52823128 http://j ...
- Hessian示例:Java和C#通信
一个简单的利用Hessian在Java和C#之间通信的例子,服务端为Java,客户端为C#. 资源下载 先要准备好C#和Java的第三方类库:http://hessian.caucho.com/ Hs ...
- Android 开发规范
一. 总包命名规范: 1. 主程序:com . 公司简写 . 项目名称简写 如彩票主程序: com.whszzy.caipiao 2. 独立模块:com . 公司简写 . 项目名称简写 . 模块名称 ...
- 让不支持MVC3的服务器/空间/虚拟主机 支持MVC3 (前提是必须支持 .net 4.0才可以)
在有的时候,你用的VPS,服务器或者是虚拟空间可能是没有安装MVC3的,下面我们就自己来手动来让虚拟空间支持(前提是空间必须是.net 4.0的,因为MVC3是在4.0下运行) 我们先在web.con ...
- C# 文件过滤器filter
OpenFileDialog对话框的Filter属性说明: 首先说明一个示例,分析一下Filter属性的构成:“ Excel文件|*.xls ”,前面的“Excel文件”成为标签,是一个可读的字符串, ...
- unity3d Start执行不同时问题
1.一个Scene的场景里有许多的GameObject,很多GameObject上绑定了Script,每个Script上又都有Start函数 using UnityEngine; using Syst ...
- require.js初试(with angular & optimization)
如果你只是想找一款称手的js加载器,可以参考这篇js loader benchmarks(http://artzstudio.com/files/Boot/test/benchmarks/script ...
- gcc和g++头文件和库路径的寻找和添加
对所有用户有效修改/etc/profile文件 对个人有效则修改~/.bashrc文件 #在PATH中找到可执行文件程序的路径. export PATH =$PATH:$HOME/bin (可一次指定 ...
- 如何使用Maven scope
maven 有6个scope类型,下面简单总结备忘下 <dependency> <groupId>javax.servlet</groupId> <artif ...
- eclipse中设置文件的编码格式为utf-8
1.可以在 eclipse 中配置 workspace 项下 text file encoding 属性的值来决定此工作区间下所有的 eclipse 项目的文档的编码属性. Window-->P ...