簡體   English   中英

如何在 QT Creator 上將 QWidget 聲明為繼承的 class 的 object?

[英]How to declare a QWidget as object of an inherited class on QT Creator?

我有一個 MyComboBox class,繼承自QComboBox ,以覆蓋方法focusOutEvent

  1. 我的組合框.h
 class MyComboBox: public QComboBox { public: MyComboBox(); protected: void focusOutEvent(QFocusEvent * e) override; };
  1. 我的組合框.cpp
 #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。 多態!

這是壞消息:

  1. 首先,您需要在實例化MyComboBox之前delete ui->comboBox ,否則您放置在設計器中的 combobox 將在表單中作為子項保留。
  2. 實例化您的MyComboBox並將其分配給ui->comboBox不會將您的 combobox 放置在您放置“原始”combobox 的 position 上。 並且不會有您建立的信號->插槽連接。 你需要自己做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM