QT 中 关键字讲解(emit,signal,slot)
class Demo : public QObject
{
Q_OBJECT public:
Demo();
int value() const { return val; }; public slots:
void setValue( int ); signals:
void valueChanged( int ); private:
int val;
}; 由样例可看到,类的定义中有两个关键字slots和signals,还有一个宏Q_OBJECT。在Qt的程序中如果使用了信号与反应槽就必须在类的定义中声明这个宏,不过如果你声明了该宏但在程序中并没有信号与反应槽,对程序也不会有任何影响,所以建议大家在用Qt写程序时不妨都把这个宏加上。使用slots定义的就是信号的功能实现,即反应槽,例如: void Demo::setValue( int v )
{
if ( v != val )
{
val = v;
emit valueChanged(v);
}
} 这段程序表明当setValue执行时它将释放出valueChanged这个信号。
以下程序示范了不同对象间信号与反应槽的连接。 Demo a, b; connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int))); b.setValue( ); a.setValue( ); b.value(); // b的值将是79而不是原先设的11
class Q_EXPORT QMetaObject
{
public:
QMetaObject( const char * const class_name, QMetaObject *superclass,
const QMetaData * const slot_data, int n_slots,
const QMetaData * const signal_data, int n_signals);
virtual ~QMetaObject();
int numSlots( bool super = FALSE ) const;
int numSignals( bool super = FALSE ) const;
int findSlot( const char *, bool super = FALSE ) const; int findSignal( const char *, bool super = FALSE ) const; const QMetaData *slot( int index, bool super = FALSE ) const; const QMetaData *signal( int index, bool super = FALSE ) const; QStrList slotNames( bool super = FALSE ) const; QStrList signalNames( bool super = FALSE ) const; int slotOffset() const;
int signalOffset() const;
static QMetaObject *metaObject( const char *class_name );
private:
QMemberDict *init( const QMetaData *, int );
const QMetaData *slotData;
QMemberDict *slotDict;
const QMetaData *signalData;
QMemberDict *signalDict;
int signaloffset;
int slotoffset;
};
void QObject::connectInternal( const QObject *sender, int signal_index,const QObject *receiver,int membcode, int member_index )
{
QObject *s = (QObject*)sender;
QObject *r = (QObject*)receiver;
if ( !s->connections )
{
s->connections = new QSignalVec( );
s->connections->setAutoDelete( TRUE );
}
QConnectionList *clist = s->connections->at( signal_index );
if ( !clist )
{
clist = new QConnectionList;
clist->setAutoDelete( TRUE );
s->connections->insert( signal_index, clist );
}
QMetaObject *rmeta = r->metaObject();
switch ( membcode ) {
case QSLOT_CODE:
rm = rmeta->slot( member_index, TRUE );
break;
case QSIGNAL_CODE:
rm = rmeta->signal( member_index, TRUE );
break;
}
QConnection *c = new QConnection( r, member_index,
rm ? rm->name : "qt_invoke", membcode ); clist->append( c );
if ( !r->senderObjects )
{ r->senderObjects = new QObjectList;
}
r->senderObjects->append( s );
}
void QObject::activate_signal( QConnectionList *clist, QUObject *o )
{
if ( !clist )
return;
QObject *object;
QConnection *c;
if ( clist->count() == ) { c = clist->first();
object = c->object();
sigSender = this;
if ( c->memberType() == QSIGNAL_CODE )
object->qt_emit( c->member(), o );
else
object->qt_invoke( c->member(), o );
} else {
QConnectionListIt it(*clist);
while ( (c=it.current()) ) {
++it;
object = c->object();
sigSender = this;
if ( c->memberType() == QSIGNAL_CODE )
object->qt_emit( c->member(), o );
else
object->qt_invoke( c->member(), o );
}
}
}
#define slots // slots: in class
#define signals protected // signals: in class
#define emit // emit signal
#define SLOT(a) "1"#a
#define SIGNAL(a) "2"#a
#define Q_OBJECT \
public: \
virtual QMetaObject *metaObject() const { \
return staticMetaObject(); \
}
\
virtual const char *className() const; \
virtual void* qt_cast( const char* ); \
virtual bool qt_invoke( int, QUObject* ); \
virtual bool qt_emit( int, QUObject* ); \
QT_PROP_FUNCTIONS
\
static QMetaObject* staticMetaObject(); \
QObject* qObject() { return (QObject*)this; } \
QT_TR_FUNCTIONS
\
private: \
static QMetaObject *metaObj;
QMetaObject *Demo::metaObj = ;
void Demo::initMetaObject()
{
if ( metaObj )
return;
if ( strcmp(QObject::className(), "QObject") != )
badSuperclassWarning("Demo","QObject");
(void) staticMetaObject();
} QMetaObject* Demo::staticMetaObject()
{
if ( metaObj )
return metaObj;
(void) QObject::staticMetaObject();
typedef void(Demo::*m1_t0)(int);
m1_t0 v1_0 = Q_AMPERSAND Demo::setValue;
QMetaData *slot_tbl = QMetaObject::new_metadata(); QMetaData::Access *slot_tbl_access = QMetaObject::new_metaaccess();
slot_tbl[].name = "setValue(int)";
slot_tbl[].ptr = *((QMember*)&v1_0); slot_tbl_access[] = QMetaData::Public;
typedef void(Demo::*m2_t0)(int);
m2_t0 v2_0 = Q_AMPERSAND Demo::valueChanged;
QMetaData *signal_tbl = QMetaObject::new_metadata();
signal_tbl[].name = "valueChanged(int)";
signal_tbl[].ptr = *((QMember*)&v2_0); metaObj = QMetaObject::new_metaobject( "Demo", "QObject",
slot_tbl, ,
signal_tbl, ,
, );
metaObj->set_slot_access( slot_tbl_access );
return metaObj;
}
// 有信号时即激活对应的反应槽或另一个信号
void Demo::valueChanged( int t0 )
{
activate_signal( "valueChanged(int)", t0 );
}
QT 中 关键字讲解(emit,signal,slot)的更多相关文章
- Qt中连接到同一signal的多个slots的执行顺序问题(4.6以后按连接顺序执行)
起源 前些天忘记在哪儿讨论过这个问题,今天在csdn又看到有网友问这个问题,而其他网友却无一例外的给出了“无序”这个答案. Manual Qt的问题,当manual中有明确文字说明时,我们应该以Qt的 ...
- Qt中连接到同一signal的多个slots的执行顺序问题(现在是看连接顺序,以前是无序的)
in the order they have been connected 起源 前些天忘记在哪儿讨论过这个问题,今天在csdn又看到有网友问这个问题,而其他网友却无一例外的给出了“无序”这个答案. ...
- 第15.16节 PyQt(Python+Qt)入门学习:PyQt中的信号(signal)和槽(slot)机制以及Designer中的使用
老猿Python博文目录 老猿Python博客地址 一.引言 前面一些章节其实已经在使用信号和槽了,但是作为Qt中最重要的机制也是Qt区别与其他开发平台的重要核心特性,还是非常有必要单独介绍. 二.信 ...
- QT窗体间传值总结之Signal&Slot
在写程序时,难免会碰到多窗体之间进行传值的问题.依照自己的理解,我把多窗体传值的可以使用的方法归纳如下: 1.使用QT中的Signal&Slot机制进行传值: 2.使用全局变量: 3.使用pu ...
- 详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)
使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享 ...
- 第四章 、PyQt中的信号(signal)和槽(slot)机制以及Designer中的使用
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 前面章节其实已经在使用信号和槽了,但是作为Qt中最重要的机制也是Qt区别与其他开发平台的重 ...
- Qt中调用PolarSSL库(一)
最近一直在学习SSL相关的知识,也是先了解理论相关的知识,主要是SSL相关的基本概念和连接建立过程,主要是基于PolarSSL开源库进行学习.学习完了之后就希望能给有所运用,就想用Qt写一个简单的程序 ...
- Qt中的QWebView
一.Webkit了解 Webkit是一个开源的浏览器引擎,chrome也使用了作为核心.Qt中对Webkit做了封装,主要有以下几个类: QWebView :最常用的类,作为一个窗体控件 QWeb ...
- qt中信号与槽机制
一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不 ...
随机推荐
- AJXA!让体验更美好
AJXA = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服 ...
- DOMO1
以下是Demo首页的预览图 demo下载:http://www.eoeandroid.com/forum.php?mod=attachment&aid=NjE0Njh8ZTIyZDA2M2N8 ...
- HDFS NameNode 设计实现解析
接前文 分布式存储-HDFS 架构解析,我们总体分析了 HDFS 架构的主要构成组件包括:NameNode.DataNode 和 Client.本文首先进一步解析 HDFS NameNode 的设计和 ...
- Got the Best Employee of the year 2015 Star Award
Got "The Best Employee of the year 2015 Star Award" from the company, thanks to all that h ...
- ASP.NET MVC 控制器激活(三)
ASP.NET MVC 控制器激活(三) 前言 在上个篇幅中说到从控制器工厂的GetControllerInstance()方法来执行控制器的注入,本篇要讲是在GetControllerInstanc ...
- [ASP.NET MVC 小牛之路]08 - Area 使用
ASP.NET MVC允许使用 Area(区域)来组织Web应用程序,每个Area代表应用程序的不同功能模块.这对于大的工程非常有用,Area 使每个功能模块都有各自的文件夹,文件夹中有自己的Cont ...
- C语言 · 送分啦
问题描述 这题想得分吗?想,请输出"yes":不想,请输出"no". 输出格式 输出包括一行,为"yes"或"no". ...
- Java Collections.sort方法对list集合排序
1.排序测试类 package com.ljq.test; import java.util.ArrayList; import java.util.Collections; import java. ...
- C#设计模式-桥接模式
这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视品牌的遥控 ...
- SSRS 报表点击 Preview 显示失败
今天使用Remote Desktop 链接到Remote Server,在SSDT中创建一个RDL文件,点击PreView预览时,出现以下错误信息 查看details information ==== ...