Qt物件導向:繼承
為什麼需要繼承其他類別?
圖一.繼承QComboBox |
之前描述類別就如同產品設計圖可量產產品,程式設計者藉由宣告類別變數產生多個物件.然而,產品設計圖是會變動的,若直接在此設計圖塗改,就再也無法生產舊產品,因此我們通常會將舊的設計圖保存,新的設計圖將以此為範本來擴展產品功能.接下來,我將解釋繼承原理和實作.
如圖一所示,被繼承的類別QComboBox稱為『父類別』,而繼承的類別MyComboBox是『子類別』.
MyComboBox is a QComboBox= QComboBox is extended by MyComboBox
繼承在英文經常用『 is a』描述父子類別的關係.簡單來說,MyComboBox是一個QComboBox,而MyComoBox以QComboBox為基礎擴充.若不懂,請你思考父親與男人所代表的意義!父親是一個男人,然而父親多了照顧小孩的責任.也就是說,即使這個男人多了扮演父親角色,不會改變他是一個男人.總而言之,子類別將擁有父類別的所有特性,也能對父類別進行功能擴展和修改,最重要的是子類別的任何修改都不會影響父類別.
到目前為止,我想你應該充分了解什麼是繼承,接下來將教你如何實作圖一.MyComoBox主要擁有提示訊息功能,並且解決之前在QComboBox使用技巧一文中所提到使用者可編輯的問題.此範例根據GitHub-QtProject的範例修正QComboBox的功能.
到目前為止,我想你應該充分了解什麼是繼承,接下來將教你如何實作圖一.MyComoBox主要擁有提示訊息功能,並且解決之前在QComboBox使用技巧一文中所提到使用者可編輯的問題.此範例根據GitHub-QtProject的範例修正QComboBox的功能.
程式碼
#ifndef MYCOMOBOX_H
#define MYCOMOBOX_H
#include <QComboBox>
class MyComoBox : public QComboBox
{
Q_OBJECT
public:
explicit MyComoBox(QWidget *parent) :
QComboBox(parent)
{
placeholder=QStringLiteral("請選擇縣市");
//this->insertItem(0,placeholder);
}
private:
QString placeholder;
protected:
void focusOutEvent(QFocusEvent *e)
{
QComboBox::focusOutEvent(e);
if(this->findText(placeholder)!=-1)
{
this->removeItem(this->findText(placeholder));
}
}
};
#endif // MYCOMOBOX_H
說明
- placeholder: 顯示QComoboBox的提示訊息.
- override focusOutEvent 成員函數:主要發生在當使用者打開下拉式選單,由於placeholder不提供使用者選擇,因此我們需要移除此項目.首先,我們利用findText尋找是否有此選項.若有,呼叫removeItem移除此項目.
- 宣告此類別變數時,依照你的需求請手動加以下指令或改寫以上的程式碼.
if(MyComoBox->findText(placeholder))
MyComoBox->insertItem(0,placeholder);
MyComoBox->setCurrentIndex(0);
留言
張貼留言