How to Use Signals and Slots/zh: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
 
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
'''简体中文''' [[How to Use Signals and Slots|English]]
{{Cleanup | reason=Auto-imported from ExpressionEngine.}}


=怎样使用信号与槽?=
[[Category:Developing with Qt::General]]
[[Category:HowTo]]
[[Category:Snippets]]
[[Category:Tutorial]]
[[Category:Learning]]


==概览==
 
'''简体中文''' [[How_to_Use_Signals_and_Slots|English]]
 
= 怎样使用信号与槽? =
 
== 概览 ==


还记得 X-Window 上老旧的回调函数系统吗?通常它不是类型安全的并且很复杂。(使用)它(会)有很多的问题。Qt提供了一种新的事件处理系统-信号-槽。想象一下闹钟(工作的样子)。当闹铃响的时候,它正在发出信号(发射)。而你处理这个事件的过程就类似使用一个槽的样子。
还记得 X-Window 上老旧的回调函数系统吗?通常它不是类型安全的并且很复杂。(使用)它(会)有很多的问题。Qt提供了一种新的事件处理系统-信号-槽。想象一下闹钟(工作的样子)。当闹铃响的时候,它正在发出信号(发射)。而你处理这个事件的过程就类似使用一个槽的样子。
Line 11: Line 20:
* 可以把一个槽与另一个槽连接起来(做成信号链)
* 可以把一个槽与另一个槽连接起来(做成信号链)
* 每个信号与槽之间可以有无限制数量的连接
* 每个信号与槽之间可以有无限制数量的连接
* '''注意:''' 不能为槽的参数设置缺省值。例如以下代码是错误的:<br />
* '''注意:''' 不能为槽的参数设置缺省值。例如以下代码是错误的:


==信号与槽的连接==
<code>
void mySlot(int i = 0);
</code>
 
== 信号与槽的连接 ==


可以使用下面的模板(原型)连接信号和槽:
可以使用下面的模板(原型)连接信号和槽:


必须把上式中的const char * signal和const char * method分别放进<span class="caps">SIGNAL</span> 和<span class="caps">SLOT</span> 这两个宏里面。
<code>
QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method);
</code>
必须把上式中的const char * signal和const char * method分别放进SIGNAL() 和SLOT() 这两个宏里面。


可以像下面那样解除信号和槽的连接:
可以像下面那样解除信号和槽的连接:


==进一步探讨==
<code>
QObject::disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method);
</code>


当事件发生时,某个部件(或对象)就会发射信号。比如,当一个按钮部件被点击时,它就会发出“被点击“这个信号。开发者可以选择创建一个函数(没错,它就是一个“槽”),并使用<code>connect()</code>来把这个信号与槽关联起来。Qt的信号与槽机制(被设计成)并不要求这些相关的类互相了解,这就使得开发高度可重用的类变得更容易。由于信号与槽是类型安全的,类型错误会以警告的方式(被编译器)报告出来并且不会引起(程序)崩溃。
== 进一步探讨 ==
 
当事件发生时,某个部件(或对象)就会发射信号。比如,当一个按钮部件被点击时,它就会发出"被点击"这个信号。开发者可以选择创建一个函数(没错,它就是一个"槽"),并使用<code>connect()</code>来把这个信号与槽关联起来。Qt的信号与槽机制(被设计成)并不要求这些相关的类互相了解,这就使得开发高度可重用的类变得更容易。由于信号与槽是类型安全的,类型错误会以警告的方式(被编译器)报告出来并且不会引起(程序)崩溃。


举例来说,假如一个Quit按钮的<code>clicked()</code>信号与应用程序的<code>quit()</code>槽相连接,那么当用户点击该Quit按钮时,就会终止这个程序的运行。用代码实现该连接如下:
举例来说,假如一个Quit按钮的<code>clicked()</code>信号与应用程序的<code>quit()</code>槽相连接,那么当用户点击该Quit按钮时,就会终止这个程序的运行。用代码实现该连接如下:
<code>connect(button, SIGNAL (clicked()), qApp, SLOT (quit()));</code>


在应用程序运行期间的任何时候,信号与槽的连接都可以被添加或移除。它们可以在信号被立即或者安排到以后去发射时建立起来,而且可以用于不同对象间的多线程应用中。
在应用程序运行期间的任何时候,信号与槽的连接都可以被添加或移除。它们可以在信号被立即或者安排到以后去发射时建立起来,而且可以用于不同对象间的多线程应用中。


信号与槽机制是使用标准C++实现的。它使用了C++中的预处理器以及Qt中的<code>moc</code>, 即元对象编译器( Meta-Object Compiler)。代码的生成由Qt的构建系统(Qt’s-Build-System)自动完成。开发者几乎不需要浏览或者编辑这些代码。
信号与槽机制是使用标准C+''实现的。它使用了C中的预处理器以及Qt中的<code>moc</code>, 即元对象编译器( Meta-Object Compiler)。代码的生成由Qt的构建系统(Qt's-Build-System)自动完成。开发者几乎不需要浏览或者编辑这些代码。
 
除了完成信号与槽的处理,元对象编译器还对Qt的多语言机制、属性系统以及扩展的运行时类型识别提供了支持。它还为C++程序的运行时内省在所有支持的平台上的运行提供了一种途径。
 
==参见==
 
[http://blog.csdn.net/qter_wd007/article/details/5598264 Qt中的信号与槽详解] ''[blog.csdn.net]''


===Categories:===
除了完成信号与槽的处理,元对象编译器还对Qt的多语言机制、属性系统以及扩展的运行时类型识别提供了支持。它还为C''+程序的运行时内省在所有支持的平台上的运行提供了一种途径。


* [[:Category:Developing-with-Qt|Developing with Qt]]
== 参见 ==
** [[:Category:Developing-with-Qt::General|General]]
* [[:Category:HowTo|HowTo]]
* [[:Category:Learning|Learning]]
* [[:Category:snippets|snippets]]
* [[:Category:Tutorial|Tutorial]]

Latest revision as of 15:38, 19 August 2016

This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine.
Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean.


简体中文 English

怎样使用信号与槽?

概览

还记得 X-Window 上老旧的回调函数系统吗?通常它不是类型安全的并且很复杂。(使用)它(会)有很多的问题。Qt提供了一种新的事件处理系统-信号-槽。想象一下闹钟(工作的样子)。当闹铃响的时候,它正在发出信号(发射)。而你处理这个事件的过程就类似使用一个槽的样子。

  • 每个QObject类(或其派生类)的对象都可以含有你能想象到的一样多的信号和槽
  • 只有定义过这个信号的类或者其派生类能够发射这个信号
  • 可以把一个槽与另一个槽连接起来(做成信号链)
  • 每个信号与槽之间可以有无限制数量的连接
  • 注意: 不能为槽的参数设置缺省值。例如以下代码是错误的:
void mySlot(int i = 0);

信号与槽的连接

可以使用下面的模板(原型)连接信号和槽:

QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method);

必须把上式中的const char * signal和const char * method分别放进SIGNAL() 和SLOT() 这两个宏里面。

可以像下面那样解除信号和槽的连接:

QObject::disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method);

进一步探讨

当事件发生时,某个部件(或对象)就会发射信号。比如,当一个按钮部件被点击时,它就会发出"被点击"这个信号。开发者可以选择创建一个函数(没错,它就是一个"槽"),并使用

connect()

来把这个信号与槽关联起来。Qt的信号与槽机制(被设计成)并不要求这些相关的类互相了解,这就使得开发高度可重用的类变得更容易。由于信号与槽是类型安全的,类型错误会以警告的方式(被编译器)报告出来并且不会引起(程序)崩溃。 举例来说,假如一个Quit按钮的

clicked()

信号与应用程序的

quit()

槽相连接,那么当用户点击该Quit按钮时,就会终止这个程序的运行。用代码实现该连接如下:

connect(button, SIGNAL (clicked()), qApp, SLOT (quit()));

在应用程序运行期间的任何时候,信号与槽的连接都可以被添加或移除。它们可以在信号被立即或者安排到以后去发射时建立起来,而且可以用于不同对象间的多线程应用中。

信号与槽机制是使用标准C+实现的。它使用了C中的预处理器以及Qt中的

moc

, 即元对象编译器( Meta-Object Compiler)。代码的生成由Qt的构建系统(Qt's-Build-System)自动完成。开发者几乎不需要浏览或者编辑这些代码。

除了完成信号与槽的处理,元对象编译器还对Qt的多语言机制、属性系统以及扩展的运行时类型识别提供了支持。它还为C+程序的运行时内省在所有支持的平台上的运行提供了一种途径。

参见