西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)其它知識 → 關于虛函數和 Qt 的 Event 函數的簡單說明

關于虛函數和 Qt 的 Event 函數的簡單說明

相關軟件相關文章發(fā)表評論 來源:本站整理時間:2010/11/19 11:53:47字體大。A-A+

作者:佚名點擊:130次評論:0次標簽: 虛函數 Qt Event函數

QT語音V4.6.22(17784) 官方最新版
  • 類型:QQ2015大。57.9M語言:中文 評分:8.9
  • 標簽:
立即下載
看到有些留言有問關于虛函數和 Qt 中的各種 event 的相關問題,考慮到留言回復中的種種局限,這里先另起一篇吧。說明一下,這些都是 C++ 面向對象的特性,如果你不明白,應該考慮再多看看 C++ 哦~

1. QAbstractTableModel 例子中有很多定義的函數都并未看到被調用,我注意到了這一句話“這個函數在用戶編輯數據時會自動調用”說的是 setData() 函數,但是其他的難道也都是?可是這些都是自己定義的函數?系統(tǒng)怎么會知道?

2. 像void MyTableWidget::mouseMoveEvent(QMouseEvent *event) 這類的事件到底是誰調用它的?就是說我不明白那個event的參數是誰傳給它的?

為了說明這個問題,我們先來看這個例子:
class CityModel : public QAbstractTableModel
{ Q_OBJECT public: CityModel(QObject *parent = 0);
void setCities(const QStringList &cityNames);
int rowCount(const QModelIndex &parent) const;
int columnCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
bool setData(const QModelIndex &index, const QVariant &value, int role);
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
private: int offsetOf(int row, int column) const;
QStringList cities; QVector distances;
};
CityModel 繼承自 QAbstractTableModel。下面我們去看看 QAbstractTableModel 的代碼,位于 src/corelib/kernel/qabstractitemmodel.h。我們發(fā)現,除去第一個 setCities(const QStringList &) 函數,其他的函數在其基類中都標有 virtual 關鍵字。

在面向對象設計中有一個概念是多態(tài)。多態(tài)的實現可以有很多種。例如,我們可以以父類的指針去指向一個子類的對象。為什么呢?因為子類和父類是 is-a 的關系,也就是說,如果 B 是 A 的子類,那么可以看成,B 是一個 A。我們就可以用父類的指針去指向子類的對象,例如下面的代碼:

class Parent { public: virtual void func() { cout << "parent"; } void func2() { cout << "parent"; } }; class Child : public Parent { public: virtual void func() { cout << "child"; } void func2() { cout << "child"; } }; Parent *p = new Child; p->func(); p->func2(); 最后一行,看似語句兩邊類型不同,實際上,由于 Child 是 Parent 的子類,父類的指針可以指向子類對象,因此這里是合法的。這么做有什么好處呢?請看我們的 func() 函數是 virtual 的。而子類也有一個同名的 func() 函數構成了重寫的關系(注意,子類在重寫父類 virtual 函數時不需要寫出 virtual 關鍵字,這里我們只是為了明顯才寫出來)。virtual 關鍵字保證,在父類指針指向子類對象的情況下,正如我們這里看到的,使用這個父類指針調用 virtual 函數,會執(zhí)行子類的代碼。也就是說,我們的 p->func(); 會輸出 child。但是對于普通函數,例如這里的 func2(),就沒有這種關系。因此,p->func2(); 還是輸出 parent。這就是 virtual 的作用。要理解為什么我們寫的函數有很多并沒有被我們調用,或者是 Qt event 函數的參數是被誰傳進來的,是被誰調用的,就得理解 virtual 的含義。

下面試想一下 Qt 的設計。比如我們的 model。你怎么能知道用戶究竟需要什么樣的 model 呢?難道你能夠窮盡世界中所有的 model,并且每一個給出一個類嗎?當然不可能。那么怎么辦呢?我們的 view 就是需要有 model 啊!對于 Qt 設計人員,也面臨著這個問題。怎么解決呢?來看一下下面的代碼:

class AbstarctModel {
public: virtual void setData();
virtual int rowCount(); virtual int columnCount();
};
class View
{
public: void setModel(AbstractModel *m)
{
model = m;
}
void showView()
{
int r = model->rowCount();
int col = model->columnCount();
// ...
}
private: AbstractModel *model;
};
class MyModel : public AbstractModel
{ public: void setData(); i
nt rowCount();
int columnCount(); };
View *view = new View;
view->setModel(new MyModel);

AbstractModel 里面有三個 virtual 函數。View 需要一個 AbstractModel 的指針用來在 showView() 函數中使用。我們怎么讓用戶能夠簡單的使用 View 類呢?我們要求用戶去自定義一個 model,叫做 MyModel,這個 model 要求繼承 AbstractModel,并且必須重新它的三個函數。這樣,在我們建立 View 對象的時候,將這個 MyModel 的指針傳給 View 的 setModel() 函數。注意,這個函數的參數要求是 AbstractModel *,而由于 MyModel 是 AbstractModel 的子類,因此二者構成 is-a 的關系,所以這個函數也可以接受一個 MyModel 指針。這樣一來,我們就讓 View 和我們自己的 MyModel 協(xié)同工作起來。

從這個簡單的例子可以看出,我們自定義的 model 其實就是為了提供我們自己的幾個函數,讓 Qt 在使用其父類指針調用 virtual 函數的時候,實際執(zhí)行的是我們自己的代碼。這類似與一種運行時的代碼替換的功能。我們再仔細思考下 event 函數,其實也是類似的。注意,所有的 event 函數也是 virtual 的哦!當 Qt 去調用這些 virtual 函數的時候,就會把需要的 event 指針傳進去。

實際上,這是一個很有用的技術。幾乎所有的設計模式都是用這種技術,如果你希望再去深入學習各種設計模式,就要好好理解這種技術了。
    lols5直播
    (16)lols5直播
    直播軟件西西下載專區(qū)為您提供英雄聯(lián)盟比賽直播軟件下載大全,包含電腦直播軟件和手機直播,并且還有眾多比賽視頻哦直播簡介已經開打了一段時間,盡管中國隊的表現不盡人意,但是還是有眾多的玩家對比賽報以期待。英雄聯(lián)盟系列總決賽是比賽里面最高榮譽,各個強隊將齊聚在這偉大的殿堂,決出世界上最強的隊伍。西西本頁為您提供直播軟件下載,為您提供比賽視頻打包下載。直播軟件有哪些直播地址主要是官網的騰訊視頻語音以及龍珠斗...更多>>
    qt語音
    (16)qt語音
    語音作為先進的多人語音交流工具,具有卓越的性能。它的安裝包只有不到左右,相當小巧,即便在運行時也只占用極低的系統(tǒng)資源,不會影響同時進行的其它在線活動雖然占用資源低,卻能夠通過領先的語音編碼算法最大限度實現語音的連貫性和清晰度,保證清晰流暢的通話質量同時,語音還使用了先進的技術,能夠完美穿越局域網防火墻,因而無論在公司家里還是網吧,都能夠輕松使用自建語音服務器,實現多人在線語音聊天。...更多>>
    • QT語音V4.6.22(17784) 官方最新版

      12-15 / 57.9M

      推薦理由:QT語音是一款支持多人語音交流的團隊語音通信工具,主要面向需團隊協(xié)作的游戲用戶,也適用于需多人語音溝通
    • QT語音客戶端優(yōu)化器V1.0綠色版

      07-31 / 355KB

      推薦理由:QT語音是騰訊公司開發(fā)的一款多人聊天工具,語音質量優(yōu)異,不過這類工具一般都占用很大的內存,有什么工具能
    • qt語音主持人音效器v1.0 綠色版

      07-04 / 3.1M

      推薦理由:qt語音主持人音效器集合了85種音效,讓你在聊天室中所向披靡。。特點在原有的30種音效中,添加了大量音效
    • QT語音(QTalk)V4.4.1綠色版

      02-23 / 27.9M

      推薦理由:QQTalk是一款支持多人語音交流的團隊語音通信工具,主要面向需團隊協(xié)作的游戲用戶,也適用于需多人語音溝通
    • QT語音場控助手v1.2 綠色版

      03-16 / 1.1M

      推薦理由:QT語音社區(qū)-場控助手V1.0編寫全新界面。獨家制作各種便捷功能, 編寫場控文本編輯器(新增 修改 刪除 保存 讀
    • qt語音自動加好友工具v1.2 免費版

      02-19 / 2.1M

      推薦理由:qt語音外宣輔助 全自動加好友工具有自動切換頻道,加好友,私密,等等外宣功能,支持QT語音3.5.4以上等最新
    QQ2017
    (24)QQ2017
    酷炫界面隨心而動,與眾不同。全新皮膚引擎,輕松上傳美圖作為皮膚,體驗屬于自己的視覺盛宴。專業(yè)高品質的界面構想,為您帶來無與倫比的視覺享受。下載正式版免費下載已經免費提供給廣大騰訊用戶進行下載了,如果你還是在使用舊版本,那么你已經了,快來下載正式版來體驗下新版本帶給你的快樂吧正式版新增劃詞搜索功能,邊聊邊搜更輕松,新增會員超級表情功能,聊天更有生動有趣最新版官方下載是在系列版本的基礎上,全新設計與定...更多>>
    • QQ20178.9.20026 官方最新版

      02-08 / 60.2M

      推薦理由:qq2017最新版官方下載,QQ2017全新設計回歸本源設計,讓您的目光停留在您所關注的內容上,大大提升了溝通的
    • QQ2014最新體驗版6.6.13074 官方安

      11-11 / 55.8M

      推薦理由:騰訊體驗中心本次推出的QQ性能體驗版3.0,通過改造基礎架構和框架,針對關鍵功能深度優(yōu)化,重點提升了啟動,
    • iPhoneQQ2016v6.5.9 正式版

      11-04 / 178M

      推薦理由:QQ手機版,致力于更完美的移動社交、娛樂與生活體驗——樂在溝通15年,聊天歡樂8億人!QQ2016foriPhone全新
    • QQ2014 for WP84.3 官方最新版

      06-10 / 20M

      推薦理由:QQ for WP8正式發(fā)布,視頻功能更上一層樓,新增視頻時切換到后臺、切換到后置攝像頭、本方和對方畫面切換等
    • QQ輕聊版for windowsv7.9(14305) 官

      12-02 / 46.5M

      推薦理由:QQ輕聊版for windows是騰訊為pc端客戶推出的一款精簡版qq,用過手機qq輕聊版的用戶對輕聊版應該都有個大概的
    • 手機QQ2017 for Androidv6.6.9 官方

      02-14 / 37.8M

      推薦理由:全新的手機QQ2017版正式發(fā)布。qq2017新版本在保留原有功能基礎上,加入2套趣味表情,并對UI進行簡化設計,去

    相關評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字數: 0/500 (您的評論需要經過審核才能顯示)