为什么在此插槽中需要qobject_cast for Sender()
Why is qobject_cast required in this SLOT for sender()?
来自qt的计算器示例:
void Calculator::digitClicked()
{
Button *clickedButton = qobject_cast<Button *>(sender());
int digitValue = clickedButton->text().toInt();
if (display->text() == "0" && digitValue == 0.0)
return;
if (waitingForOperand) {
display->clear();
waitingForOperand = false;
}
display->setText(display->text() + QString::number(digitValue));
}
此插槽连接到所有数字按钮:
digitButtons[i] = createButton (QString::number(i), SLOT(digitClicked()));
使用createButton
:
Button *Calculator::createButton(const QString &text, const char *member)
{
Button *button = new Button(text);
connect(button, SIGNAL(clicked()), this, member);
return button;
}
那么,在插槽中,为什么需要类型?
Button *clickedButton = qobject_cast<Button *>(sender());
基本上, sender()
返回 QObject*
,因此您将无法调用基础对象的方法,直到它被降低为止。
qobject_cast
执行降低,在运行时检查基础对象实际上是所需类型的。这类似于标准dynamic_cast
,除了由于QT的元对象设施而其成本降低(但它仅适用于从QObject
派生的类)。
请参阅QT关于Meta-Object System的文档。
相关文章:
- "error: no matching function for call to"构造函数错误
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何在C++中从两个单独的for循环中添加两个数组
- 在Linux for Windows上编译C++代码时出错
- 如何理解C++标准N3337中的expr.const.cast子句8
- 调用专用模板时出错"no matching function for call to [...]"
- 为什么我的for循环不能正确获取argv
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 在基于范围的for循环中使用结构化绑定声明
- C++Cast运算符过载
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- C++:"Expected '(' for function-style cast or type construction"错误
- Cast boost::array<float, 12> for function with argument(const float (&arr)[12])
- "Expected '(' for function-style cast or type construction"错误是什么意思?
- Cast int to void* and void* to int for TMemoryStream->WriteBuffer (C++Builder XE7)