为什么此SLOT中的sender()需要qobject_cast?

时间:2016-11-29 08:16:40

标签: c++ qt

来自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());

1 个答案:

答案 0 :(得分:1)

基本上,sender()会返回QObject*,因此在下传之前,您将无法调用基础对象的方法。

qobject_cast执行向下转换,而在运行时检查基础对象实际上是所需类型。这类似于标准dynamic_cast,除了由于Qt的元对象设施而降低了成本(但它仅适用于从QObject派生的类。)

请参阅Qt关于meta-object system

的文档