QT 信号与槽 – 苦涩的茶

总结:

1、大众在信号先前是难承认的事的。、公有和支援被修正。;插槽可以添加先前。,因QT表现槽职务可以用作普通职务。。

2、信号区域的效能葡萄汁是空的典型。,同时这些信号职务不具有效能。,更确切地说,你不克不及本人清晰度这些信号职务。,你但愿申报就够了。,等等管,向内的QT。

3、宏清晰度和职务协助不克不及用于信号和插槽PA,没信号和时隙的默许限度局限因素。。

一、概述
二、信号
三、槽
四、信号与孔隙相互关系
五、元灵器
六、排队样例
七、应坚持到底的成绩
相互关系资源
著作家
作者:西塘华 (xhsmart@) 软件工程师

作为QT的结心机制,QT次中往国外的适用了信号和时隙。,本文绍介了信号和时隙的稍许地基本概念。、元灵器及其应坚持到底的成绩。 

QT 这是独一跨平台的C. 图形用户界面适用边框,他供给物了一组使富有的小合成的。,具有正视灵、很可能性发展、真实的立法机构节目首数。,更为有目共睹的是眼前Linux上去盛行的KDE桌面任务平台执意构筑在QT库的根底伸突出。Qt支援以下平台:MS/WINDOWS-95、98、NT和2000;UNIX/X11-Linux、Sun Solaris、HP-UX、Digital Unix、IBM AIX、SGI IRIX;嵌入式支援边框缓冲的Linux平台。跟随KDE的迅速发展和普及,QT很可能性产生Linux上软件冲洗的最适度GUI选择。 

一、概述 

信号和孔隙机制是QT的结心机制。,要使干燥QT节目,你葡萄汁担心涉及信号的满意的。。信号和时隙是优级代言人。,灵间的一致,他是QT的结心首数。,也QT辨别于等等器包的要紧当地的。信号和时隙是由QT清晰度的一致机制。,他不依赖于基准的C/C 表达能力。,从此处,敝葡萄汁特定节日等用的仪式处理信号和时隙。,帮忙适用独一叫元(元) Object 编纂者的QT器,该器是C 对举行预处理器。,他优美的体型非本意的举措优美的体型优级事情PR的附加加密。。 
在敝熟习的很多的GUI器包中,窗口小合成的(widget)都有独一回调职务用于应答他们能小溪的每个举措,因此回调职务通常是表明职务的协助。。不外,在 QT博狗官网和槽移走了这些复杂的的职务协助,使得敝作曲这些一致排队更为简练的明了。信号和槽可以促使什么都可以号码和什么都可以典型的限度局限因素。,它们是完整保险柜的。,它不优美的体型类比回调职务的内核。 dumps。 
一切从QObjor或其子集(比如Qwidget)派生的类都可以象征信号和槽。当灵时尚其养护时,因此信号是从灵收回的。,这是一切灵葡萄汁做的。,他不知情谁在另一对头缝接受的号。。这是真正的通讯封装。,他确保灵被用作独一真正的软件立法机构。。接接受的号槽,但它们是普通的灵会员职务。。时隙不知情一切信号以防衔接到本人。。同时,灵不担心委派的一致机制。。 
你可以用独一时隙衔接很多信号。,它还可以衔接单信号与很多的槽。,将信号衔接到另一信号是可能性的。,此刻,无论如何以防启动第独一信号,体系启动。。不管怎样,信号和时隙指派了独一强大的的立法机构节目机制。。 

二、信号 

当信号时尚其客户或一切者的向内养护时。,因此信号是由独一灵开枪的。。独一无二的清晰度信号及其派生类的类才干输送。当信号启动时,与之相互关系联的时隙将马上履行。,就像独一普通职务转乘。。信号槽机制完整独立于一切GUI事情整数的。。反复职务只在一切时隙反复过后反复。(开枪)。以防有多个时隙,则它与独一信号相互关系联。,这么,当信号被开枪时,这些时隙将独一接独一地履行。,但他们会照办命令。随机的、缺乏自信的不克不及人工控制委派。哪个先履行?、哪个实行?。 
信号的结算单在头用锉锉中履行。,Qt的信号保留字表现它已进入信号州。,那时的你可以州你本人的信号。。比如,下面清晰度了三个信号。: 
signals: 
void mySignal(); 
void mySignal(int) x); 
void mySignalParam(int) x,int y); 
在下面的清晰度中,信号是QT的关键词。,非C/C。下伙伴虚空 mySignal() 信号My-信号被清晰度。,此信号不促使限度局限因素。;下伙伴虚空 mySignal(int) X)清晰度反复选派信号MySoad。,但他促使塑造的限度局限因素。,这少量地类比于C击中要害虚职务。。方法上,信号州与普通C 职务平稳的。,再,没效能体的清晰度。,另一边,信号的反复典型是使退役的。,不要认为可以从信号中反复使对某人有利的通讯。。 
该信号由MOC非本意的举措优美的体型。,它们不必须在.CPP用锉锉中产生。。 

三、槽 

插槽是独一普通的C 会员职务。,可以合格的转乘。,它们专有的的首数是很多信号可以与I相互关系联。。当与之相互关系联的信号被开枪时,因此刻隙将被转乘。。槽有限度局限因素,已经槽的限度局限因素不克不及有默许值。。 
因槽是独一普通的会员职务,因而它和等等职务俱。,他们也有拜访权力。。时隙的拜访权力决议谁可以与它相互关系。。与普通C 会员职务平稳的。,时隙职务也可分为三种典型。,即大众 slots、private slots和protected slots。 
public slots:在因此区域颁布发表的时隙要紧一切灵都可以将信号衔接到它们。。这就立法机构节目非凡的使对某人有利。,您可以创办彼此没察觉到的的灵。,衔接他们的信号和时隙,大意是通讯可以输送。。 
protected slots:在因此区域颁布发表的时隙要紧今天类及其子集可以将信号衔接到它们。。这符合的that的单数油箱。,它们是类产生的偏爱地。,再,它的代言人是正视内部的。。 
private slots:在因此区域颁布发表的时隙要紧独一无二的类可以将信号衔接到它们。。这符合的亲密相互关系的类。。 
时隙也可以州为虚职务。,这也非凡的使对某人有利的。。 
时隙的州也在头用锉锉中履行。。比如,下面有三个用长笛般的声音歌唱。: 

public slots:
void mySlot();
void mySlot(int) x);
void mySignalParam(int) x,int y);

四、信号与孔隙相互关系 

经过呼叫QObjt灵的衔接职务将灵的信号与另一灵的槽职务相互关系联,因而当开枪机开枪信号时,,接纳器的插槽效能将被转乘。。职务的清晰度如次。: 
bool QObjult:衔接 ( const QObjor * sender, const char * signal, const QObjor * receiver, const char * member ) [定态]
因此职务的功能执意将开枪者sender灵击中要害信号signal和接纳者receiver击中要害member槽职务连接点起来。在委派信号信号时葡萄汁适用QT宏信号。在委派时隙职务时,葡萄汁适用宏时隙。。以防开枪机和接纳机属于同独一灵,,那时的,在衔接呼叫中,可以省略接纳机限度局限因素。。 
比如,下面清晰度两个灵。:)技术援助委灵)技术援助委和骨碌条灵骨碌,并将valueChanged()信号和)技术援助委灵的setNum()相互关系联,同时,该信号还带有塑料制的限度局限因素。,因此)技术援助委不断地显示骨碌条的评价。。 
QLabel *label = new QLabel; 
QScrollBar *scroll = new QScrollBar; 
QObjult:衔接( scroll, 信号(Valuechange(int)), label, 插槽(StNUM(int)) ); 
独一信号甚至可以与另独一信号相互关系联。,请看下面的判例。: 
class MyWidget : public QWidget 

public: 
MyWidget(); 
… 
signals: 
void aSignal(); 
… 
private: 
… 
QPushButton *aButton; 
}; 
MyWidget::MyWidget() 

aButton = new QPushButton( this ); 
connect( aButton, 信号(点击), SIGNAL(aSignal()) ); 

在下面的构造的职务中,MyWIDGET创办了独一公有钮扣Abutton。,钮扣的单击事情产生的信号clicked()和另一边独一信号aSignal() 举行了关系。左右一来,当信号点击()收回时,信号ASIN()也被发送。。自然,您还可以直截了当地将单击事情与公有槽职务相互关系联。,那时的,在槽中收回信号。,这如同少量地富余。。 
当信号和时隙不喜欢持续衔接时,敝可以用它。断开效能断开衔接。。清晰度如次: 
bool QObjor::disconnect ( const QObjor * sender, const char * signal, const Object * receiver, const char * member ) [定态]
此职务断冲洗送博狗官网私下的相互关系性。。 
在三种环境下,敝葡萄汁适用断开()职务。: 
(1)断开与灵相互关系联的一切灵。。这如同少量地难以担心。,确实,当敝在独一灵中清晰度独一或多个信号时,这些信号与数个等等灵击中要害时隙相互关系联。,以防敝想掉队它们,,敝可以用因此办法。,非凡的简练的。 
disconnect( myObject, 0, 0, 0 ) 或 myObject->disconnect() 
(2)用委派的信号断开一切衔接。。 
disconnect( myObject, SIGNAL(mySignal()), 0, 0 ) 或 myObject->disconnect( SIGNAL(mySignal()) ) 
(3)断开两个灵私下的衔接。。 
disconnect( myObject, 0, myReceiver, 0 ) 或 myObject->disconnect( myReceiver ) 

在断开效能中0可以用作通配符。,辨别是非表现一切信号。、一切收件人、接纳灵击中要害一切时隙职务。不外开枪机发送器不克不及为0。,等等三个限度局限因素可以同样看待0。。  

五、元灵器 

元灵编纂者MOC(元) object compiler)对C++用锉锉击中要害类州举行辨析并产生用于设定初值元灵的C++加密,元灵象征一切信号、槽和协助的选派。。 
moc 读取C 源用锉锉,以防被发现的人一类qyObjor宏州,他将优美的体型另独一C 源用锉锉。,因此新优美的体型的用锉锉象征因此类的元灵加密。。比如,承担敝有独一头用锉锉。,象征该用锉锉击中要害信号或时隙的结算单。,编制前 moc 该器非本意的举措优美的体型独一名为C 的源用锉锉性交丢弃T;类比地,对应于用锉锉MOC 该器将非本意的举措优美的体型独一名为提丢弃COMP的用锉锉。。 

元灵加密就信号/时隙机制是基本要素的。。由MOC优美的体型的C 源用锉锉葡萄汁编制并与,或适用象征结算单的类象征在类的源用锉锉中。。MOC没发展γ的清晰度,包孕清晰度宏或清晰度宏。,他仅仅简略的清晰地所尤指不期而遇的一切对举行预处理秩序。 

六、排队样例 

这是独一简略的示例次。,次清晰度了三个信号。、三槽职务,那时的,信号与插槽衔接。,每个插槽职务只汽水对话框窗口。。讲读者可以适用KDebug创办独一简略的QT适用次。,那时的将下面的加密添加到呼应的次中。。 
信号和时隙职务的州通常定位姓名牌FI中。,同时葡萄汁在类州的启程添加qyObjor结算单。,因此供述是不可缺少的的。他将通知编纂者在编制前适用。 MOC器的发展。保留字信号暗示后续信号的州。,嗨,信号适用单数而责任剩余的。,不上级的、 private、支援和等等属性,这与时隙形形色色的。。另一边,signals、槽保留字由Qt自己清晰度。,责任C击中要害保留字。 
信号的州类比于职务RATH的州。,左翼必然有一种典型。,向右的支架。,以防要将限度局限因素递送到插槽,在支架中委派每个方法限度局限因素的典型。,自然,方法限度局限因素的数量可以很独一。。 
保留字时隙暗示后续时隙的州。,槽也以单数方法适用。。 
独一时隙的州与独一合格的职务的州平稳的。,它可以促使零或更正式的限度局限因素。。鉴于信号的供述类比于普通的供述,这么,信号也可以用C击中要害虚职务的方法州。,更确切地说,平稳的的选派,但形形色色的的限度局限因素。。比如,空泛的候选人提拔会清晰度 MySoad()没限度局限因素。,次要的个清晰度具有限度局限因素。,从嗨敝可以看出QT的信号机制是非凡的易弯曲的的。。 
信号和插槽私下的衔接葡萄汁事前用CON委派。。以防敝想突变两党私下的连接点,可以适用职务断开。 

 1//tsignal.h  2 3class TsignalApp:public QMainWindow 
 4{ 
 5Q_OBJECT 
 6 7//信号申报区  8signals: 
 9//结算单信号 10void mySignal(); 
11//结算单信号MySoint(int) 12void mySignal(int x); 
13//结算单信号MySalePARAM(int),int) 14void mySignalParam(int x,int y); 
15//时隙州区 16public slots: 
17//州槽职务 18void mySlot(); 
19//州槽职务mySlot(int)) 20void mySlot(int x); 
21//州槽职务MySalePARAM (int),int) 22void mySignalParam(int x,int y); 
23} 
2425//tsignal.cpp 2627TsignalApp::TsignalApp() 
28{ 
2930//信号MySoad()与槽MyS槽的关系 31 connect(this,SIGNAL(mySignal()),SLOT(mySlot())); 
32//将信号mySignal(int))和槽mySlot(int))相互关系联 33 connect(this,SIGNAL(mySignal(int)),SLOT(mySlot(int))); 
34//将信号mySignalParam(int),int)和槽mySlotParam(int),int)相互关系联 35 connect(this,SIGNAL(mySignalParam(int,int)),SLOT(mySlotParam(int,int))); 
36} 
37// 清晰度槽职务MyS槽 38void TsignalApp::mySlot() 
39{ 
40 QMessageBox::about(this,”Tsignal”, “This is a signal/slot sample without 
41限度局限因素。 
42} 
43// 清晰度槽职务mySlot(int)) 44void TsignalApp::mySlot(int x) 
45{ 
46 QMessageBox::about(this,”Tsignal”, “This is a signal/slot sample with one 
47限度局限因素。 
48} 
49// 清晰度槽职务mySlotParam(int),int) 50void TsignalApp::mySlotParam(int x,int y) 
51{ 
52char s[256]; 
53 sprintf(s,”x:%d y:%d”,x,y); 
54 QMessageBox::about(this,”Tsignal”, s); 
55} 
56void TsignalApp::slotFileNew() 
57{ 
58//发送信号 59emit mySignal(); 
60//开枪信号mySignal(int)) 61 emit mySignal(5); 
62//开枪信号MySigalPARAM(5),100) 63 emit mySignalParam(5,100); 
64 } 

七、应坚持到底的成绩 

信号和槽机制是对立易弯曲的的。,但也有稍许地限度局限敝葡萄汁担心。,左右在实践的适用程序中做到有的放矢,使无效差错。。下面是对这种环境的绍介。。 
(1)信号和时隙的功效非凡的高。,但与实践回调职务相形。,鉴于易弯曲的性加法运算,因而职业左右有损害的。,自然,这种损害对立较小。,经过一站 I586133机的份量是10一百万分之一秒(运转Linux),可以看出这种机制所供给物的简略性。、易弯曲的性是值当的。。已经以防敝想网球场高功效,比如,在实时体系中,因此机制必须被用作独一小的A。。 
(2)信号和时隙机制与普通效能平稳的。,以防适用不妥,还可以在次履行次发存亡环。。从此处,在清晰度时隙职务时,要坚持到底使无效旧的优美的体型。,更确切地说,在槽中再次接纳到平稳的的信号。。比如,在下面装备的示例中,以防在MySwitter()槽中添加独一结算单 MySead()可以体现独一死区域。。 
(3)以防信号与多个用长笛般的声音歌唱相互关系联,这么,当信号被开枪时,与槽相互关系的起动次是随机的。。 
(4)宏清晰度不克不及用于信号和时隙的限度局限因素。。 
既然MOC器不发展清晰度,从此处,在信号和时隙中促使限度局限因素的宏不克不及合格的任务。,没限度局限因素是可能性的。。比如,在下面的示例中,适用限度局限因素的宏Signistic(a)不一致脸色的: 
#ifdef ultrix 
#define 西维因(A) unsigned a 
#else 
#define 西维因(A) a 
#endif 
class Whatever : public QObjor 

[…] 
signals: 
void someSignal( 西维因(A) ); 
[…] 
}; 
(5)构造的职务不克不及用于信号或时隙州区域。。 
实在,在信号或时隙中叙事诗构造的职务少量地难以担心。,无论如何怎样,他们不克不及被公有化。 slots、protected slots或public 插槽面积。下列的用法责任脸色想要。: 
class SomeClass : public QObjor 

Q_OBJECT 
public slots: 
SomeClass( QObjor *parent, const char *name ) 
: QObjor( parent, name ) {} // 在时隙州区内州构造的职务不一致脸色 
[…] 
}; 
(6)职务协助不克不及作为信号或时隙限度局限因素适用。。 
比如,在下面的示例中,使退役 (*applyFunction)(QList*, 空*)责任脸色上的独一限度局限因素。: 
class someClass : public QObjor 

Q_OBJECT 
[…] 
public slots: 
void 适用(使退役) (*applyFunction)(QList*, void*), char*); // 不一致脸色 
}; 
您可以适用以下办法来避免此限度局限。: 
typedef void (*ApplyFunctionType)(QList*, void*); 
class someClass : public QObjor 

Q_OBJECT 
[…] 
public slots: 
void apply( ApplyFunctionType, char *); 
}; 
(7)没信号和时隙的默许限度局限因素。。 
因信号->槽绑定在运转时产生。,这么,从概念上讲,适用默许限度局限因素是登陆处的。。以下用法不一致理。: 
class SomeClass : public QObjor 

Q_OBJECT 
public slots: 
void someSlot(int) x=100); // 将x的默许值清晰度为100,在槽职务州中适用不特定节日等用的仪式。

}; 

(8)信号和槽不克不及促使模板类限度局限因素。。 

以防信号翻开、槽被州为模板类限度局限因素。,设想MOC器没说话能力或方法差错,要吸引过早地提出的掉队不可能的事性的。。比如,在下面的示例中,当信号被收回时,不克不及特定节日等用的仪式转乘插槽职务。: 
[…] 
public slots: 
void MyWidget::setLocation (对) 评价)
[…] 
public signals: 
void MyObject::moved (对) 评价)
不外,您可以适用TyWIFF结算单来避免此限度局限。。如次所示: 
typedef pair IntPair; 
[…] 
public slots: 
void MyWidget::setLocation (IntPair 评价)
[…] 
public signals: 
void MyObject::moved (IntPair 评价)

用这种方法适用的词,你可以利润特定节日等用的仪式的算是。。 

(9)嵌套类不克不及定位信号或插槽区域中。,没信号或插槽。。 

比如,在下面的判例中,上固定时间 B击中要害州槽B()不具有脸色意思。,在信号区域中州时隙B()并责任脸色上的。。 
class A 

Q_OBJECT 
public: 
class B 

public slots: // 在嵌套类中州独一时隙是不符符合脸色的。
void b(); 
[….] 
}; 
signals: 
class B 

// 在信号区域中州嵌套类是不符符合脸色的。
void b(); 
[….] 
}: 
}; 

(10)友元州不克不及定位信号或时隙州区内。相反,它们必须是普通C 的公有。、在支援区或公共区申报。下面的判例不一致脸色章程。: 

class someClass : public QObjor 

Q_OBJECT 
[…] 
signals: 信号清晰度区
friend class ClassTemplate; // 因此清晰度是不符符合脸色的。
};

转自:

发表评论

电子邮件地址不会被公开。 必填项已用*标注