[英]Call method on subclass given pointer to superclass
我在一组中有一组按钮:
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实例上调用增量方法。 我可以在buttons
调用一个方便的checkedButton()
方法,但是该方法返回一个指向QAbstractButton的指针。
我不能在指针或QAbstractButton上调用increment
。 buttons->checkedButton()->increment();
产生error: no member named 'increment' in 'QAbstractButton'
。 如何增加所选的MyButton?
您只需要让编译器知道您使用的是MyButton*
而不是QAbstractButton*
,这意味着QAbstractButton*
。
如果您知道指针是MyButton*
则只需执行static_cast<MyButton*>(buttons->checkedButton())->increment();
如果您不知道它是否为MyButton*
则需要进行检查,这意味着类似以下内容:
MyButton* temp = dynamic_cast<MyButton*>(buttons->checkedButton());
if(temp != nullptr) temp->increment();
编辑: SaZ指出 qobject_cast
比dynamic_cast
更可取,因为:
它不需要RTTI支持,并且可以跨动态库边界工作
MyButton
已经继承自QObject
,但还有另一个限定条件,即它是使用Q_OBJECT
声明的。 如果同时满足这两个条件,则可以简单地用qobject_cast
替换dynamic_cast
:
MyButton* temp = qobject_cast<MyButton*>(buttons->checkedButton());
if(temp != nullptr) temp->increment();
请注意,对于QObject
派生类,您可以并且应该使用qobject_cast()
而不是动态qobject_cast()
。 通过使用Qt元系统,效率更高。
另外,与动态转换不同,它在不带RTTI以及动态库的情况下也可以工作。
动态将QAbstractButton
为MyButton
并调用increment()
。
QAbstractButton* abstractButton = buttons->checkedButton();
MyButton* myButton = dynamic_cast<MyButton*>(abstractButton);
if (myButton)
{
myButton->increment();
}
为了完整起见,对于Qt程序,您还可以使用信号插槽系统:如果将increment
声明为slot
则可以使用:
QMetaObject::invokeMethod(abstractButton, "increment");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.