C++ 为什么sender()的此插槽中需要qobject_强制转换?

C++ 为什么sender()的此插槽中需要qobject_强制转换?,c++,qt,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;

从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));
}
使用
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());
Button*clickedButton=qobject_cast(sender());
基本上,
sender()
返回一个
QObject*
,因此在底层对象被降级之前,您将无法调用它的方法

qobject\u cast
执行向下转换,同时在运行时检查底层对象是否有效地为所需类型。这类似于标准的
dynamic_cast
,只是由于Qt的元对象功能,它的成本降低了(但它只适用于从
QObject
派生的类)


请参阅Qt的文档。

您是否尝试删除强制转换以查看编译器将告诉您什么?因为它需要访问
digitClicked
插槽中的
按钮
成员,并且
sender()
返回
QObject
类型。在Qt5中,您可以使用lambdas调用插槽,并将按钮文本作为参数传递。@thuga也感谢您。我应该检查发件人的返回类型。请注意,使用sender()被认为是不干净的。使用lambdas或QSignalMapper。
Button *clickedButton = qobject_cast<Button *>(sender());