给定超类

时间:2015-10-04 01:19:25

标签: c++ qt inheritance

我在一组中有一组按钮:

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实例上调用increment方法。我可以在checkedButton()上调用一个方便的buttons方法,但它返回一个指向QAbstractButton的指针。

我无法在指针或QAbstractButton上调用incrementbuttons->checkedButton()->increment();会产生error: no member named 'increment' in 'QAbstractButton'。如何增加选定的MyButton?

4 个答案:

答案 0 :(得分:2)

你只需要让编译器知道你使用的是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,因为:{/ p>

  

它不需要RTTI支持,它可以跨动态库边界工作

MyButton已经从QObject继承,但还有一个限定条件,它是使用Q_OBJECT声明的。如果同时符合这两项资格,那么您只需将dynamic_cast替换为qobject_cast

MyButton* temp = qobject_cast<MyButton*>(buttons->checkedButton());

if(temp != nullptr) temp->increment();

答案 1 :(得分:2)

请注意,对于<input type="hidden" value="<?php echo Mage::getSingleton('core/session')->getFormKey()?>" name="form_key"/> 派生类,您可以而且应该使用QObject而不是动态强制转换。采用Qt元系统可以提高效率。

此外,与动态强制转换不同,它在没有RTTI的情况下进行编译,也可以在动态库中进行。

答案 2 :(得分:1)

动态广播QAbstractButtonMyButton并致电increment()

QAbstractButton* abstractButton = buttons->checkedButton();
MyButton* myButton = dynamic_cast<MyButton*>(abstractButton);
if (myButton)
{
    myButton->increment();
}

答案 3 :(得分:-1)

为了完整起见,在Qt程序的情况下,您也可以使用信号槽系统:如果increment被声明为slot,那么这将起作用:

QMetaObject::invokeMethod(abstractButton, "increment");