繁体   English   中英

给子类的指针上的调用方法给出超类的指针

[英]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_castdynamic_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以及动态库的情况下也可以工作。

动态将QAbstractButtonMyButton并调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM