我在一组中有一组按钮:
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上调用increment
。 buttons->checkedButton()->increment();
会产生error: no member named 'increment' in 'QAbstractButton'
。如何增加选定的MyButton?
答案 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 它不需要RTTI支持,它可以跨动态库边界工作 qobject_cast
优于dynamic_cast
,因为:{/ p>
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)
动态广播QAbstractButton
至MyButton
并致电increment()
。
QAbstractButton* abstractButton = buttons->checkedButton();
MyButton* myButton = dynamic_cast<MyButton*>(abstractButton);
if (myButton)
{
myButton->increment();
}
答案 3 :(得分:-1)
为了完整起见,在Qt程序的情况下,您也可以使用信号槽系统:如果increment
被声明为slot
,那么这将起作用:
QMetaObject::invokeMethod(abstractButton, "increment");