WHAT'S NEW?
Loading...

Qt物件導向:繼承

為什麼需要繼承其他類別?

圖一.繼承QComboBox

之前描述類別就如同產品設計圖可量產產品,程式設計者藉由宣告類別變數產生多個物件.然而,產品設計圖是會變動的,若直接在此設計圖塗改,就再也無法生產舊產品,因此我們通常會將舊的設計圖保存,新的設計圖將以此為範本來擴展產品功能.接下來,我將解釋繼承原理和實作.

如圖一所示,被繼承的類別QComboBox稱為『父類別』,而繼承的類別MyComboBox是『子類別』.
MyComboBox is a QComboBox= QComboBox is extended by MyComboBox

繼承在英文經常用『 is a』描述父子類別的關係.簡單來說,MyComboBox是一個QComboBox,而MyComoBox以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



說明

  1. placeholder: 顯示QComoboBox的提示訊息.
  2. override focusOutEvent 成員函數:主要發生在當使用者打開下拉式選單,由於placeholder不提供使用者選擇,因此我們需要移除此項目.首先,我們利用findText尋找是否有此選項.若有,呼叫removeItem移除此項目.
  3. 宣告此類別變數時,依照你的需求請手動加以下指令或改寫以上的程式碼.
  4. if(MyComoBox->findText(placeholder))
      MyComoBox->insertItem(0,placeholder);
    MyComoBox->setCurrentIndex(0);
    

結果


0 comments:

張貼留言