簡體   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