西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发其它知识 → 关于虚函数和 Qt 的 Event 函数的简单说明

关于虚函数和 Qt 的 Event 函数的简单说明

相关软件相关文章发表评论 来源:本站整理时间: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() 函数,但是其他的难道也都是?可是这些都是自己定义的函数?系统怎么会知道?

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。我们发现,除去第一个 setCities(const QStringList &) 函数,其他的函数在其基类中都标有 virtual 关键字。

在面向对象设计中有一个概念是多态。多态的实现可以有很多种。例如,我们可以以父类的指针去指向一个子类的对象。为什么呢?因为子类和父类是 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 函数,会执行子类的代码。也就是说,我们的 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 协同工作起来。

从这个简单的例子可以看出,我们自定义的 model 其实就是为了提供我们自己的几个函数,让 Qt 在使用其父类指针调用 virtual 函数的时候,实际执行的是我们自己的代码。这类似与一种运行时的代码替换的功能。我们再仔细思考下 event 函数,其实也是类似的。注意,所有的 event 函数也是 virtual 的哦!当 Qt 去调用这些 virtual 函数的时候,就会把需要的 event 指针传进去。

实际上,这是一个很有用的技术。几乎所有的设计模式都是用这种技术,如果你希望再去深入学习各种设计模式,就要好好理解这种技术了。
    lols5直播
    (16)lols5直播
    直播软件西西下载专区为您提供英雄联盟比赛直播软件下载大全,包含电脑直播软件和手机直播,并且还有众多比赛视频哦直播简介已经开打了一段时间,尽管中国队的表现不尽人意,但是还是有众多的玩家对比赛报以期待。英雄联盟系列总决赛是比赛里面最高荣誉,各个强队将齐聚在这伟大的殿堂,决出世界上最强的队伍。西西本页为您提供直播软件下载,为您提供比赛视频打包下载。直播软件有哪些直播地址主要是官网的腾讯视频语音以及龙珠斗...更多>>
    qt语音
    (16)qt语音
    语音作为先进的多人语音交流工具,具有卓越的性能。它的安装包只有不到左右,相当小巧,即便在运行时也只占用极低的系统资源,不会影响同时进行的其它在线活动虽然占用资源低,却能够通过领先的语音编码算法最大限度实现语音的连贯性和清晰度,保证清晰流畅的通话质量同时,语音还使用了先进的技术,能够完美穿越局域网防火墙,因而无论在公司家里还是网吧,都能够轻松使用自建语音服务器,实现多人在线语音聊天。...更多>>
    QQ2017
    (24)QQ2017
    酷炫界面随心而动,与众不同。全新皮肤引擎,轻松上传美图作为皮肤,体验属于自己的视觉盛宴。专业高品质的界面构想,为您带来无与伦比的视觉享受。下载正式版免费下载已经免费提供给广大腾讯用户进行下载了,如果你还是在使用旧版本,那么你已经了,快来下载正式版来体验下新版本带给你的快乐吧正式版新增划词搜索功能,边聊边搜更轻松,新增会员超级表情功能,聊天更有生动有趣最新版官方下载是在系列版本的基础上,全新设计与定...更多>>
    • QQ20178.9.20026 官方最新版

      02-08 / 60.2M

      推荐理由:qq2017最新版官方下载,QQ2017全新设计回归本源设计,让您的目光停留在您所关注的内容上,大大提升了沟通的
    • QQ2014最新体验版6.6.13074 官方安

      11-11 / 55.8M

      推荐理由:腾讯体验中心本次推出的QQ性能体验版3.0,通过改造基础架构和框架,针对关键功能深度优化,重点提升了启动,
    • iPhoneQQ2016v6.5.9 正式版

      11-04 / 178M

      推荐理由:QQ手机版,致力于更完美的移动社交、娱乐与生活体验——乐在沟通15年,聊天欢乐8亿人!QQ2016foriPhone全新
    • QQ2014 for WP84.3 官方最新版

      06-10 / 20M

      推荐理由:QQ for WP8正式发布,视频功能更上一层楼,新增视频时切换到后台、切换到后置摄像头、本方和对方画面切换等
    • 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版正式发布。qq2017新版本在保留原有功能基础上,加入2套趣味表情,并对UI进行简化设计,去

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)