[英]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.