Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt类中的插槽和信号是什么意思?_C++_Qt_Oop - Fatal编程技术网

C++ Qt类中的插槽和信号是什么意思?

C++ Qt类中的插槽和信号是什么意思?,c++,qt,oop,C++,Qt,Oop,我正在学习Qt教程,这时我遇到了以下代码: #include <QObject> class Counter : public QObject { Q_OBJECT public: Counter() { m_value = 0; } int value() const { return m_value; } public slots: void setValue(int value); signals: voi

我正在学习
Qt
教程,这时我遇到了以下代码:

 #include <QObject>

 class Counter : public QObject
 {
     Q_OBJECT

 public:
     Counter() { m_value = 0; }

     int value() const { return m_value; }

 public slots:
     void setValue(int value);

 signals:
     void valueChanged(int newValue);

 private:
     int m_value;
 };
#包括
类计数器:公共QObject
{
Q_对象
公众:
计数器(){m_值=0;}
int value()常量{返回m_值;}
公众时段:
无效设置值(int值);
信号:
无效值已更改(int newValue);
私人:
int m_值;
};
有人能向我解释一下声明中的
公共插槽
信号
的用法吗?我想只有两种,
公共的
私人的
。它们叫什么?它们的用途是什么

信号和插槽是Qt中为 对象之间的通信[1],这使得实现 观察员模式,同时避免样板代码。概念是 GUI小部件可以发送包含事件信息的信号,这些信息可以 由使用称为插槽的特殊功能的其他控件接收

信号/插槽系统非常适合图形用户的方式 设计了接口。同样,也可以使用信号/插槽系统 对于其他非GUI用途,例如异步I/O(包括 插座、管道、串行设备等)事件通知或 将超时事件与适当的对象实例和方法关联 或功能。它很容易使用,而且没有任何问题 需要编写注册/注销/调用代码, 因为Qt的元对象编译器(MOC)会自动生成 需要的基础设施

一个常用的比喻是电子表格。电子表格有两个单元格 观察源单元格的。当源单元格发生更改时 从事件中更新相关单元格

不错的解释来自


因为Qt基本上是发明了这个概念,所以最好是你实际阅读你在问题中发布的文章

特别是:

信号

当对象的内部状态发生变化时,会发出信号 在某种程度上,对象的客户机或所有者可能会感兴趣。 只有定义信号的类及其子类才能发出 信号

当发出信号时,与之相连的插槽通常是 立即执行,就像正常的函数调用一样。当这 发生这种情况时,信号和插槽机制完全独立于任何 GUI事件循环。在emit语句之后执行代码 将在所有插槽返回后发生。情况稍有好转 使用排队连接时不同;在这种情况下,代码 接下来的emit关键字将立即继续,插槽 将在稍后执行

如果多个插槽连接到一个信号,则插槽将 按照连接顺序一个接一个地执行, 当信号发出时

信号由主运行中心自动生成,不得 在.cpp文件中实现。它们不能有返回类型(即。 使用void)

关于参数的说明:我们的经验表明,信号和插槽 如果不使用特殊类型,则更易于重用。如果 QScrollBar::valueChanged()将使用特殊类型,如 假设QScrollBar::Range,它只能连接到插槽 专为QScrollBar设计。连接不同的输入 把小部件放在一起是不可能的

当与插槽相连的信号发出时,将调用插槽。插槽是 普通C++函数,可正常调用;他们唯一的特色 其特点是可以将信号连接到它们

因为槽是普通成员函数,它们遵循普通C++。 直接调用时的规则。但是,作为插槽,它们可以由 通过信号插槽的任何组件,无论其访问级别如何 连接。这意味着从一个 任意类可以导致在实例中调用私有插槽 不相关的阶级的

您还可以将插槽定义为虚拟插槽,这一点我们已经发现 在实践中很有用

与回调相比,信号和插槽稍微慢一些,因为 它们提供了更大的灵活性,尽管 真正的应用是无关紧要的。一般来说,发出一个信号 连接到一些插槽,大约比 使用非虚拟函数调用直接调用接收器。这 定位连接对象以确保安全所需的开销 迭代所有连接(即检查后续接收器 在排放过程中未被销毁),并且 以通用方式创建参数。而十个非虚函数调用 听起来可能很多,它的开销比任何新的或删除的都要小得多 例如,操作。执行字符串、向量或 列出后台需要新建或删除的操作 信号和插槽开销只占很小的一部分 完整函数调用成本的比例

在插槽中执行系统调用时也是如此;或 间接调用十多个函数。在i586-500上,可以发射 每秒约2000000个信号连接到一个接收器,或 大约每秒1200000个连接到两个接收器。简单 信号和插槽机制的灵活性非常值得考虑 开销,用户甚至不会注意到

请注意,其他定义变量的库称为信号或 当与插槽一起编译时,插槽可能会导致编译器警告和错误 基于Qt的应用程序。要解决这一问题,就要取消违规行为的定义 预处理器符号

信号和插槽是Qt中为 对象之间的通信[1],这使得实现 避免样板代码时的观察者模式