Qt 创建了 QEvent 事件对象之后,会调用 QObject 的 event()函数做事件的分发。有时候,你可能需要在调用 event()函数之前做一些另外的操作,比如,对话框上某些组件可能并不需要响应回车按下的事件,此时,你就需要重新定义组件的 event()函数。如果组件很多,就需要重写很多次 event()函数,这显然没有效率。
今天要说的是 event()函数。记得之前曾经提到过这个函数,说在事件对象创建完毕后,Qt 将这个事件对象传递给 QObject的 event()函数。event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。event()函数主要用于事件的分发,所以,如果你希望在事件分发之前做一些操作,那么,就需要注意这个 event()函数了。
本章内容也是关于 Qt 事件。或许这一章不能有一个完整的例子,因为对于事件总是感觉很抽象,还是从底层上理解一下比较好的吧!前面说到了事件的作用,下面来看看我们如何来接收事件。
前面说了几个标准对话框,下面不打算继续说明一些组件的使用,因为这些使用很难讲完,很多东西都是与实际应用相关的。实际应用的复杂性决定了我们根本不可能把所有组件的所有使用方法都说明白。这次来说说 Qt 相对高级一点的特性:事件。事件(event)是有系统或者 Qt 本身在不同的时刻发出的。
这是 Qt 标准对话框的最后一部分。正如同其名字显示的一样,QInputDialog 用于接收用户的输入。QInputDialog 提供了一些简单的 static 函数,用于快速的建立一个对话框,正像 QColorDialog提供了 getColor 函数一样。首先来看看 getText 函数:bool isOK;
好久没有更新博客,主要是公司里面还在验收一些东西,所以没有及时更新。而且也在写一个基于 Qt 的画图程序,基本上类似于 PS 的东西,主要用到的是 Qt Graphics View Framework。好了,现在还是继续来说说 Qt 的标准对话框吧!这次来说一下 QMessageBox 以及类似的几种对话框。其实,我们已经用过 QMessageBox 了,就在之前的几个程序中。
这是一篇很简单的文章,仅仅是用来说明一下一个参数的作用,因此我把它写成了 tip,而不是接下来的17.程序写的多了,你会发现几乎所有的Qt类的构造函数都会有一个 parent 参数。这个参数通常是QObject 或者是 QWidget 类型的。很多情况下它都会有一个初始值0,因此,即便你不去给它复制也没有丝毫的问题。于是,稍微偷懒一下,就会不自觉的忽略了这个参数。
继续来说 Qt 的标准对话框,这次说说 QColorDialog。这是 Qt 提供的颜色选择对话框。使用 QColorDialog 也很简单,Qt 提供了 getColor()函数,类似于 QFileDialog 的getOpenFileName(),可以直接获得选择的颜色。我们还是使用前面的 QAction 来测试下这个函数: QColor color = QColorDialog::getColor(Qt::white, this);
《Qt 学习之路》已经写到了第15篇,然而现在再写下去却有点困难,原因是当初并没有想到会连续的写下去,因此并没有很好的计划这些内容究竟该怎样去写。虽然前面说过,本教程主要线路参考《C++ Gui Programming with Qt 4, 2nd Edition》,然而最近的章节由于原文是一个比较完整的项目而有所改变,因此现在不知道该从何写起。
有段时间没有写过博客了。假期去上海旅游,所以一直没有能够上网。现在又来到这里,开始新的篇章吧!今天的内容主要还是继续完善前面的那个程序。我们要为我们的程序加上一个状态栏。状态栏位于主窗口的最下方,提供一个显示工具提示等信息的地方。一般地,当窗口不是最大化的时候,状态栏的右下角会有一个可以调节大小的控制点;当窗口最大化的时候,这个控制点会自动消失。
前面一节我们已经把 QAction 添加到菜单和工具条上面。现在我们要添加一些图片美化一下,然后把信号槽加上,这样,我们的 action 就可以相应啦!首先来添加图标。QAction 的图标会显示在菜单项的前面以及工具条按钮上面显示。为了添加图标,我们首先要使用 Qt 的资源文件。在 QtCreator 的项目上右击,选择 New File...,然后选择 resource file。
在前面的 QMainWindow 的基础之上,我们开始着手建造我们的应用程序。虽然现在已经有一个框架,但是,确切地说我们还一行代码没有写呢!下面的工作就不那么简单了!在这一节里面,我们要为我们的框架添加菜单和工具条。就像 Swing 里面的 Action 一样,Qt 里面也有一个类似的类,叫做 QAction。
尽管 Qt 提供了很方便的快速开发工具 QtDesigner 用来拖放界面元素,但是现在我并不打算去介绍这个工具,原因之一在于我们的学习大体上是依靠手工编写代码,过早的接触设计工具并不能让我们对 Qt的概念突飞猛进……前面说过,本教程很大程度上依照的是《C++ GUI Programming with Qt4, 2nd Edition》这本书。
前面说过,Qt 使用的是自己的预编译器,它提供了对 C++ 的一种扩展。利用 Qt 的信号槽机制,就可以把彼此独立的模块相互连接起来,不需要实现知道模块的任何细节。为了达到这个目的,Qt 提出了一个 Meta-Object 系统。它提供了两个关键的作用:信号槽和内省。面向对象程序设计里面会讲到 Smalltalk 语言有一个元类系统。所谓元类,就是这里所说的 Meta-Class。
信号槽机制是 Qt 编程的基础。通过信号槽,能够使 Qt 各组件在不知道对方的情形下能够相互通讯。这就将类之间的关系做了最大程度的解耦。槽函数和普通的 C++ 成员函数没有很大的区别。它们也可以使 virtual 的;可以被重写;可以使public、protected 或者 private 的;可以由其它的 C++ 函数调用;参数可以是任何类型的。
接着前一篇,下面是源代码部分:#include <QtGui> #include "finddialog.h" FindDialog::FindDialog(QWidget *parent) : QDialog(parent) { label = new QLabel(tr("Find &what:")); lineEdit = new QLineEdit; label->setBuddy(lineEdit); caseCheckBox = new QCheckBox(tr("Match &case"));
首先说明一点,在 C++ GUI Programming with Qt4, 2nd 中,这一章连同以后的若干章一起,完成了一个比较完整的程序——一个模仿 Excel 的电子表格。不过这个程序挺大的,而且书中也没有给出完整的源代码,只是分段分段的——我不喜欢这个样子,我想要看到我写出来的是什么东西,这是最主要的,而不是慢慢的过上几章的内容才能看到自己的作品。
今天来说一下有关 Qt API 文档的使用。因为 Qt 有一个商业版本,因此它的文档十分健全,而且编写良好。对于开发者来说,查看文档时开发必修课之一——没有人能够记住那么多 API 的使用!在 Qt 中查看文档是一件很简单的事情。如果你使用 QtCreator,那么左侧的 Help 按钮就是文档查看入口。否则的话,你可以在 Qt 的安装目录下的 bin 里面的 assistant.exe 中看到 Qt 的文档。
同 Swing 类似,Qt 也提供了几种组件定位的技术。其中就包括绝对定位和布局定位。顾名思义,绝对定位就是使用最原始的定位方法,给出这个组件的坐标和长宽值。这样,Qt 就知道该把组件放在哪里,以及怎么设置组件的大小了。
看过了简单的 Hello, world! 之后,下面来看看 Qt 最引以为豪的信号槽机制!所谓信号槽,简单来说,就像是插销一样:一个插头和一个插座。怎么说呢?当某种事件发生之后,比如,点击了一下鼠标,或者按了某个按键,这时,这个组件就会发出一个信号。就像是广播一样,如果有了事件,它就漫天发声。
关注时代Java