我有一组按钮:
buttons = new QButtonGroup();
button_0 = new MyButton("A", this);
button_1 = new MyButton("B", this);
button_2 = new MyButton("C", this);
MyButton是一个QPushButton,它继承了QAbstractButton。一次可以选择组中的一个 MyButton。
MyButton::MyButton(const QString &text, QWidget *parent)
: QPushButton(text, parent)
{
this->setCheckable(true);
this->setChecked(false);
}
MyButton 有一个增量方法。
void MyButton::increment()
{
this->j++;
}
我想在当前选择的任何 MyButton 实例上调用增量方法。有一个方便的 checkedButton()
方法,我可以在 buttons
上调用它,但它会返回一个指向 QAbstractButton 的指针。
我不能在指针或 QAbstractButton 上调用 increment
。 buttons->checkedButton()->increment();
产生错误:“QAbstractButton”中没有名为“increment”的成员
。如何增加所选的 MyButton?
最佳答案
你只需要让编译器知道你正在使用 MyButton*
而不是 QAbstractButton*
,这意味着类型转换。
如果知道指针是MyButton*
那么你可以做一个static_cast<MyButton*>(buttons->checkedButton())->increment();
如果你不知道它是不是 MyButton*
然后你需要检查,这意味着像这样:
MyButton* temp = dynamic_cast<MyButton*>(buttons->checkedButton());
if(temp != nullptr) temp->increment();
编辑:
SaZ has pointed out那 qobject_cast
优于 dynamic_cast
因为:
It doesn't require RTTI support and it works across dynamic library boundaries
MyButton
已经继承自 QObject
, 但还有一个条件,它是用 Q_OBJECT
声明的.如果满足这两个条件,那么您可以简单地替换 dynamic_cast
用qobject_cast
:
MyButton* temp = qobject_cast<MyButton*>(buttons->checkedButton());
if(temp != nullptr) temp->increment();
关于c++ - 在给定指向父类(super class)的指针的子类上调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32929120/