[英]How to automatically create virtual methods from inherited class in Qt Creator?
[英]How to declare a QWidget as object of an inherited class on QT Creator?
我有一個 MyComboBox class,繼承自QComboBox
,以覆蓋方法focusOutEvent
:
class MyComboBox: public QComboBox { public: MyComboBox(); protected: void focusOutEvent(QFocusEvent * e) override; };
#include "mycombobox.h" MyComboBox::MyComboBox() { } void MyComboBox::focusOutEvent(QFocusEvent * e) { // I will code here qDebug()<<"Object has lost focus"; MyComboBox::focusOutEvent(e); }
但我不知道如何將 comboBox 聲明為 MyComboBox class 的 object,並且 MyComboBox 和 QComboBox 之間的類型不兼容
MyComboBox* oMyComboBox;
oMyComboBox = ui->comboBox;
您在 UI 上的實例必須具有 MyComboBox 類型。 它取決於 object 創建過程中的類型。 例如,如果你做了這樣的事情:
QComboBox* comboBox; // This was declared on UI
ui->comboBox = new MyComboBox();
因此您可以將此實例用作帶有 qobject_cast 的 MyComboBox:
QComboBox *oMyComboBox = qobject_cast<MyComboBox *>(ui->comboBox);
您不能將 Base class 的實例分配給其繼承者類型的變量。 所有被覆蓋的虛擬成員會發生什么? 因此,您的做法不適合 OOP 原則。 也許,您總是可以將指針轉換為它的繼承者 class,但是在訪問 class 成員時會出現運行時錯誤,除非您要轉換的指針是作為繼承者的實例創建的。
您必須手動創建 class 的實例,正如 alexb 推薦的那樣: ui->comboBox = new MyComboBox;
. 你不需要使用任何鑄造。 focusOutEvent() 是一個虛方法,將在 MyComboBox 的任何實例中調用,即使變量來自 QComboBox。 多態!
這是壞消息:
MyComboBox
之前delete ui->comboBox
,否則您放置在設計器中的 combobox 將在表單中作為子項保留。MyComboBox
並將其分配給ui->comboBox
不會將您的 combobox 放置在您放置“原始”combobox 的 position 上。 並且不會有您建立的信號->插槽連接。 你需要自己做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.