- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我反复看到人们遇到插槽未被调用的问题。我想收集一些最常见的原因。所以也许我可以帮助人们并避免很多多余的问题。
信号/插槽连接不起作用的原因是什么?如何避免此类问题?
最佳答案
有一些规则可以让信号和插槽的生活变得更轻松,并涵盖了连接缺陷的最常见原因。如果我忘记了什么,请告诉我。
1) 检查调试控制台输出:
发生执行错误时,调试输出可以显示原因。
2) 使用信号和槽的完整签名:
代替
connect(that, SIGNAL(mySignal), this, SLOT(mySlot));
写
connect(that, SIGNAL(mySignal(int)), this, SLOT(mySlot(int)));
并检查您的拼写和大小写。
connect(that, SIGNAL(mySignal(int)), this, SLOT(mySlot(int)));
总是使用类似的东西
bool success = connect(that, SIGNAL(mySignal(int)), this, SLOT(mySlot(int)));
Q_ASSERT(success);
或者,如果您喜欢抛出异常或实现完整的错误处理。您也可以使用这样的宏:
#ifndef QT_NO_DEBUG
#define CHECK_TRUE(instruction) Q_ASSERT(instruction)
#else
#define CHECK_TRUE(instruction) (instruction)
#endif
CHECK_TRUE(connect(that, SIGNAL(mySignal(int)), this, SLOT(mySlot(int))));
6) 您需要一个用于排队连接的事件循环:
exec();
在插槽的线程中!
Q_DECLARE_METATYPE(MyType)
然后使用以下调用之一:
qRegisterMetaType<MyTypedefType>("MyTypedefType"); // For typedef defined types
qRegisterMetaType<MyType>(); // For other types
8) 比旧的运行时检查语法更喜欢新的编译时语法:
connect(that, SIGNAL(mySignal(int)), this, SLOT(mySlot(int)));
使用这种语法
connect(that, &ThatObject::mySignal, this, &ThisObject::mySlot));
它在编译时检查信号和槽,甚至不需要目标是实际槽。
connect(that, static_cast<void (ThatObject::*)(int)> &ThatObject::mySignal), this, &ThisObject::mySlot); // <Qt5.7
connect(that, qOverload<int>::of(&ThatObject::mySignal), this, &ThisObject::mySlot); // >=Qt5.7 & C++11
connect(that, qOverload<int>(&ThatObject::mySignal), this, &ThisObject::mySlot); // >=Qt5.7 & C++14
从 Qt5.14 开始,不推荐使用重载信号。禁用已弃用的 Qt 功能以摆脱上述恶作剧。
class SomeClass
{
Q_OBJECT
signals:
void MySignal(int x);
};
class SomeMoreClass
{
Q_OBJECT
public slots:
void MySlot(int x);
};
这个宏向类添加了必要的元信息。
connect(that, SIGNAL(mySignal(int)), this, SLOT(mySlot(int)));
emit that->mySignal(0); // Ugly, don't forget to remove it immediately
最后当然有可能只是不发射信号。如果您遵循上述规则,则您的程序逻辑可能有问题。阅读文档。使用调试器。如果现在有其他方式,请在 stackoverflow 上询问。
关于qt - 我的信号/插槽连接不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26422154/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!