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

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

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

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

作者:佚名點(diǎn)擊:130次評(píng)論:0次標(biāo)簽: 虛函數(shù) Qt Event函數(shù)

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

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

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

為了說明這個(gè)問題,我們先來看這個(gè)例子:
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),除去第一個(gè) setCities(const QStringList &) 函數(shù),其他的函數(shù)在其基類中都標(biāo)有 virtual 關(guān)鍵字。

在面向?qū)ο笤O(shè)計(jì)中有一個(gè)概念是多態(tài)。多態(tài)的實(shí)現(xiàn)可以有很多種。例如,我們可以以父類的指針去指向一個(gè)子類的對(duì)象。為什么呢?因?yàn)樽宇惡透割愂?is-a 的關(guān)系,也就是說,如果 B 是 A 的子類,那么可以看成,B 是一個(gè) A。我們就可以用父類的指針去指向子類的對(duì)象,例如下面的代碼:

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(); 最后一行,看似語句兩邊類型不同,實(shí)際上,由于 Child 是 Parent 的子類,父類的指針可以指向子類對(duì)象,因此這里是合法的。這么做有什么好處呢?請(qǐng)看我們的 func() 函數(shù)是 virtual 的。而子類也有一個(gè)同名的 func() 函數(shù)構(gòu)成了重寫的關(guān)系(注意,子類在重寫父類 virtual 函數(shù)時(shí)不需要寫出 virtual 關(guān)鍵字,這里我們只是為了明顯才寫出來)。virtual 關(guān)鍵字保證,在父類指針指向子類對(duì)象的情況下,正如我們這里看到的,使用這個(gè)父類指針調(diào)用 virtual 函數(shù),會(huì)執(zhí)行子類的代碼。也就是說,我們的 p->func(); 會(huì)輸出 child。但是對(duì)于普通函數(shù),例如這里的 func2(),就沒有這種關(guān)系。因此,p->func2(); 還是輸出 parent。這就是 virtual 的作用。要理解為什么我們寫的函數(shù)有很多并沒有被我們調(diào)用,或者是 Qt event 函數(shù)的參數(shù)是被誰傳進(jìn)來的,是被誰調(diào)用的,就得理解 virtual 的含義。

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

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

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

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

      02-20 / 35.2M

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

      12-15 / 57.9M

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

      12-14 / 30.8M

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

      12-26 / 30.2M

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

      01-24 / 41.8M

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

      06-14 / 14.3M

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

      12-15 / 57.9M

      推薦理由:QT語音是一款支持多人語音交流的團(tuán)隊(duì)語音通信工具,主要面向需團(tuán)隊(duì)協(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種音效,讓你在聊天室中所向披靡。。特點(diǎn)在原有的30種音效中,添加了大量音效
    • QT語音(QTalk)V4.4.1綠色版

      02-23 / 27.9M

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

      03-16 / 1.1M

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

      02-19 / 2.1M

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

      02-08 / 60.2M

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

      11-11 / 55.8M

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

      11-04 / 178M

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

      06-10 / 20M

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

      12-02 / 46.5M

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

      02-14 / 37.8M

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

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

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

    熱門評(píng)論

    最新評(píng)論

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

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