为什么在此插槽中需要qobject_cast for Sender()

Why is qobject_cast required in this SLOT for sender()?

本文关键字:cast for Sender qobject 插槽 为什么      更新时间:2023-10-16

来自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的文档。