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],这使得实现 避免样板代码时的观察者模式