gpt4 book ai didi

c++ - 为什么在这个 SLOT 中 sender() 需要 qobject_cast?

转载 作者:行者123 更新时间:2023-11-30 05:20:00 26 4
gpt4 key购买 nike

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

最佳答案

基本上,sender() 返回一个 QObject*,因此在向下转换之前您将无法调用底层对象的方法。

qobject_cast 执行向下转型,同时在运行时检查底层对象是否有效地属于所需类型。这类似于标准的 dynamic_cast,除了它由于 Qt 的元对象设施而降低了成本(但它只适用于从 QObject 派生的类)。

参见 Qt 关于 meta-object system 的文档.

关于c++ - 为什么在这个 SLOT 中 sender() 需要 qobject_cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40860829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com