来自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));
}
此SLOT连接到所有数字按钮:
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;
}
所以,在SLOT中为什么需要进行类型转换?
Button *clickedButton = qobject_cast<Button *>(sender());
答案 0 :(得分:1)
基本上,sender()
会返回QObject*
,因此在下传之前,您将无法调用基础对象的方法。
qobject_cast
执行向下转换,而在运行时检查基础对象实际上是所需类型。这类似于标准dynamic_cast
,除了由于Qt的元对象设施而降低了成本(但它仅适用于从QObject
派生的类。)
请参阅Qt关于meta-object system。
的文档