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

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

關(guān)于虛函數(shù)和 Qt 的 Event 函數(shù)的簡單說明

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

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

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

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

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

為了說明這個問題,我們先來看這個例子:
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。下面我們?nèi)タ纯?QAbstractTableModel 的代碼,位于 src/corelib/kernel/qabstractitemmodel.h。我們發(fā)現(xiàn),除去第一個 setCities(const QStringList &) 函數(shù),其他的函數(shù)在其基類中都標有 virtual 關(guān)鍵字。

在面向?qū)ο笤O(shè)計中有一個概念是多態(tài)。多態(tài)的實現(xiàn)可以有很多種。例如,我們可以以父類的指針去指向一個子類的對象。為什么呢?因為子類和父類是 is-a 的關(guān)系,也就是說,如果 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() 函數(shù)是 virtual 的。而子類也有一個同名的 func() 函數(shù)構(gòu)成了重寫的關(guān)系(注意,子類在重寫父類 virtual 函數(shù)時不需要寫出 virtual 關(guān)鍵字,這里我們只是為了明顯才寫出來)。virtual 關(guān)鍵字保證,在父類指針指向子類對象的情況下,正如我們這里看到的,使用這個父類指針調(diào)用 virtual 函數(shù),會執(zhí)行子類的代碼。也就是說,我們的 p->func(); 會輸出 child。但是對于普通函數(shù),例如這里的 func2(),就沒有這種關(guān)系。因此,p->func2(); 還是輸出 parent。這就是 virtual 的作用。要理解為什么我們寫的函數(shù)有很多并沒有被我們調(diào)用,或者是 Qt event 函數(shù)的參數(shù)是被誰傳進來的,是被誰調(diào)用的,就得理解 virtual 的含義。

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

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

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

實際上,這是一個很有用的技術(shù)。幾乎所有的設(shè)計模式都是用這種技術(shù),如果你希望再去深入學(xué)習(xí)各種設(shè)計模式,就要好好理解這種技術(shù)了。
    lols5直播
    (16)lols5直播
    直播軟件西西下載專區(qū)為您提供英雄聯(lián)盟比賽直播軟件下載大全,包含電腦直播軟件和手機直播,并且還有眾多比賽視頻哦直播簡介已經(jīng)開打了一段時間,盡管中國隊的表現(xiàn)不盡人意,但是還是有眾多的玩家對比賽報以期待。英雄聯(lián)盟系列總決賽是比賽里面最高榮譽,各個強隊將齊聚在這偉大的殿堂,決出世界上最強的隊伍。西西本頁為您提供直播軟件下載,為您提供比賽視頻打包下載。直播軟件有哪些直播地址主要是官網(wǎng)的騰訊視頻語音以及龍珠斗...更多>>
    • 騰訊視頻播放器2017v9.19.1987 官方

      02-20 / 35.2M

      推薦理由:騰訊視頻2016官方免費下載是騰訊視頻旗下的客戶端產(chǎn)品,支持豐富內(nèi)容的在線點播及電視臺直播,提供列表管理
    • QT語音V4.6.22(17784) 官方最新版

      12-15 / 57.9M

      推薦理由:QT語音是一款支持多人語音交流的團隊語音通信工具,主要面向需團隊協(xié)作的游戲用戶,也適用于需多人語音溝通
    • 斗魚tv電腦客戶端V2.4.2.1 官網(wǎng)版

      12-14 / 30.8M

      推薦理由:斗魚TV是acfun.tv以前的視頻直播,現(xiàn)在改名斗魚TV,跟YY直播競爭的,現(xiàn)在剛改名的斗魚TV。斗魚tv電腦版隨時
    • 手機騰訊視頻android版V5.3.0.1158

      12-26 / 30.2M

      推薦理由:騰訊視頻,qqlive安卓版是為Android手機用戶量身打造的網(wǎng)絡(luò)視頻播放客戶端。采用輕量級的界面設(shè)計、豐富多元
    • 斗魚tv安卓版2.4.5官方版

      01-24 / 41.8M

      推薦理由:斗魚tv游戲直播平臺相信對于很對電競玩家來說很熟悉了,現(xiàn)在斗魚tv強勢推出安卓手機客戶端,斗魚tv安卓版讓
    • 游久看比賽appV2.23安卓官網(wǎng)版

      06-14 / 14.3M

      推薦理由:游久看比賽app,為你帶來精彩的LOL賽事紙幣直播!夏季賽激戰(zhàn)之際,馬上有事LOL四周年,游戲賽事自然是必不可
    qt語音
    (16)qt語音
    語音作為先進的多人語音交流工具,具有卓越的性能。它的安裝包只有不到左右,相當小巧,即便在運行時也只占用極低的系統(tǒng)資源,不會影響同時進行的其它在線活動雖然占用資源低,卻能夠通過領(lǐng)先的語音編碼算法最大限度實現(xiàn)語音的連貫性和清晰度,保證清晰流暢的通話質(zhì)量同時,語音還使用了先進的技術(shù),能夠完美穿越局域網(wǎng)防火墻,因而無論在公司家里還是網(wǎng)吧,都能夠輕松使用自建語音服務(wù)器,實現(xiàn)多人在線語音聊天。...更多>>
    • QT語音V4.6.22(17784) 官方最新版

      12-15 / 57.9M

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

      07-31 / 355KB

      推薦理由:QT語音是騰訊公司開發(fā)的一款多人聊天工具,語音質(zhì)量優(yōu)異,不過這類工具一般都占用很大的內(nèi)存,有什么工具能
    • 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è)高品質(zhì)的界面構(gòu)想,為您帶來無與倫比的視覺享受。下載正式版免費下載已經(jīng)免費提供給廣大騰訊用戶進行下載了,如果你還是在使用舊版本,那么你已經(jīng)了,快來下載正式版來體驗下新版本帶給你的快樂吧正式版新增劃詞搜索功能,邊聊邊搜更輕松,新增會員超級表情功能,聊天更有生動有趣最新版官方下載是在系列版本的基礎(chǔ)上,全新設(shè)計與定...更多>>
    • QQ20178.9.20026 官方最新版

      02-08 / 60.2M

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

      11-11 / 55.8M

      推薦理由:騰訊體驗中心本次推出的QQ性能體驗版3.0,通過改造基礎(chǔ)架構(gòu)和框架,針對關(guān)鍵功能深度優(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輕聊版的用戶對輕聊版應(yīng)該都有個大概的
    • 手機QQ2017 for Androidv6.6.9 官方

      02-14 / 37.8M

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

    相關(guān)評論

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

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

    熱門評論

    最新評論

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

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