找回密码
 立即注册
收起左侧

Qt学习之路第7篇 MainWindow 简介

14
回复
48285
查看
[复制链接]
累计签到:3 天
连续签到:1 天
来源: 2013-9-8 20:06:33 显示全部楼层 |阅读模式
版权声明
该文章原创于Qter开源社区(www.qter.org),作者devbean,博客www.devbean.net转载请注明出处!


前面一篇大致介绍了 Qt 各个模块的相关内容,目的是对 Qt 框架有一个高屋建瓴般的了解。从现在开始,我们将开始尝试使用 Qt 开始新的历程。由于我们已经比较详细地介绍过信号槽的相关内容,因此我们可以用一个新的程序开始进一步的学习,同时对信号槽有一个比较深入的理解。


QMainWindow 是 Qt 框架带来的一个预定义好的主窗口类。所谓主窗口,就是一个普通意义上的应用程序(不是指游戏之类的那种)最顶层的窗口。比如你现在正在使用的浏览器,那么主窗口就是这个浏览器窗口。试着回想一下经典的主窗口,通常是由一个标题栏,一个菜单栏,若干工具栏和一个任务栏。在这些子组件之间则是我们的工作区。事实上,QMainWindow 正是这样的一种布局。


下面我们新建一个工程。还记得在新建工程的时候,Qt Creator 通常会帮助我们创建一个 MainWindow 吗?我们曾经为了介绍信号槽,将 main() 函数做了修改。现在我们直接使用 Qt Creator 生成的代码来编译运行一下:

  1. #include <QApplication>
  2. #include "mainwindow.h"

  3. int main(int argc, char* argv[])
  4. {
  5.     QApplication app;

  6.     MainWindow win;
  7.     win.show();

  8.     return app.exec();
  9. }
复制代码

在 openSUSE 上运行结果如下:





我们仔细看看这个窗口。虽然不太明显,但它实际上分成了几个部分:





主窗口的最上面是 Window Title,也就是标题栏,通常用于显示标题和控制按钮,比如最大化、最小化和关闭等。通常,各个图形界面框架都会使用操作系统本地代码来生成一个窗口。所以,你会看到在 KDE 上面,主窗口的标题栏是 KDE 样式的;在 Windows 平台上,标题栏是 Windows 风格的。如果你不喜欢本地样式,比如 QQ 这种,它其实是自己将标题栏绘制出来,这种技术称为 DirectUI,也就是无句柄绘制,这不在本文的讨论范畴。Window Title 下面是 Menu Bar,也就是菜单栏,用于显示菜单。窗口最底部是 Status Bar,称为状态栏。当我们鼠标滑过某些组件时,可以在状态栏显示某些信息,比如浏览器中,鼠标滑过带有链接的文字,你会在底部看到链接的实际 URL。


除去上面说的三个横向的栏,中间是以矩形区域表示。我们可以看出,最外层称为 Tool Bar Area,用于显示工具条区域。之所以是矩形表示,是因为,Qt 的主窗口支持多个工具条。你可以将工具条拖放到不同的位置,因此这里说是 Area。我们可以把几个工具条并排显示在这里,就像 Word2003 一样,也可以将其分别放置,类似 Photoshop。在工具条区域内部是 Dock Widget Area,这是停靠窗口的显示区域。所谓停靠窗口,就像 Photoshop 的工具箱一样,可以停靠在主窗口的四周,也可以浮动显示。主窗口最中间称为 Central Widget,就是我们程序的工作区。通常我们会将程序最主要的工作区域放置在这里,类似 Word 的稿纸或者 Photoshop 的画布等等。


对于一般的 Qt 应用程序,我们所需要做的,就是编写我们的主窗口代码,主要是向其中添加各种组件,比如菜单、工具栏等,当然,最重要的就是当中的工作区。当我们将这些都处理完毕之后,基本上程序的工具也可以很好地实现。


通常我们的程序主窗口会继承自 QMainWindow,以便获得 QMainWindow 提供的各种便利的函数。这也是 Qt Creator 生成的代码所做的。


由于 QMainWindow 这个类在 Qt 5 中并没有什么改变,因此上面的代码可以直接拿到 Qt 4 中进行编译。事实上,我们使用 Qt Creator 生成的代码也是可以直接在 Qt 4 中编译。只不过需要注意一点:Qt 4 中没有 widgets 模块,因此在 pro 文件中,我们通常需要这么来写:

  1. QT += core gui
  2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

  3. TARGET    = qtdemo
  4. TEMPLATE  = app

  5. SOURCES  += main.cpp \
  6.         mainwindow.cpp

  7. HEADERS  += mainwindow.h
复制代码

简单解释一下 pro 文件。首先,我们定义了 QT,用于告诉编译器,需要使用哪些模块。这些模块都在前面章节中有过介绍。我们通常需要添加 core 和 gui。第二行,如果 Qt 的主版本号(QT_MAJOR_VERSION)大于 4,也就是 Qt 5,则需要另外添加 widgets(因为在 Qt 5 中,所有组件都是在 widgets 模块定义的)。TARGET 是生成的程序的名字。TEMPLATE 是生成 makefile 所使用的模板,比如 app 就是编译成一个可执行程序,而 lib 则是编译成一个链接库(默认是动态链接库)。SOURCES 和 HEADERS 顾名思义,就是项目所需要的源代码文件和头文件。现在,我们只需使用默认的 pro 文件即可。以后随着项目的不断增大,pro 文件通常会非常复杂。








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
参与人数 4人气 +7 收起 理由
Evan7 + 2 对我帮助很大!
darcareys + 2 对我帮助很大!
qiusuo + 2 很实用!
恒星shephered + 1 必须支持!

查看全部评分总评分 : 人气 +7

回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2014-10-24 18:28:46 显示全部楼层
QApplication app;是不是应该改为QApplication app(argc,argv);呢?我用前面这个会出错。
回复 支持 2 反对 0

使用道具 举报

累计签到:17 天
连续签到:1 天
2014-8-22 10:45:27 显示全部楼层
很高级!这个资源布局啊。
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2014-11-10 13:12:53 显示全部楼层
为什么我的提示找不到mainwindow.h呢?我的是QT5啊。
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2014-11-10 13:57:03 显示全部楼层
知道怎么回事了,应该建一个widgets工程,我选的建一个空的工程了。 。
回复 支持 反对

使用道具 举报

累计签到:6 天
连续签到:1 天
2015-9-3 20:47:20 显示全部楼层
赞呀!!!!!!!学习了
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2016-3-10 11:11:21 显示全部楼层
学习了,希望devbean推出更加优秀的教程!
回复 支持 反对

使用道具 举报

累计签到:20 天
连续签到:1 天
2016-5-15 16:59:52 显示全部楼层
持续不断学习当中!谢谢
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2016-7-7 16:11:46 显示全部楼层
很高级!这个资源布局啊。
回复 支持 反对

使用道具 举报

尚未签到

2016-12-12 13:18:45 显示全部楼层
已阅
回复 支持 反对

使用道具 举报

累计签到:2 天
连续签到:1 天
2016-12-26 16:34:48 显示全部楼层
好东西,好资源,楼主好人啊
回复 支持 反对

使用道具 举报

累计签到:5 天
连续签到:1 天
2017-6-2 12:22:07 显示全部楼层
看了你的介绍以后 对于我这个初学者真的很有帮助哦
回复 支持 反对

使用道具 举报

累计签到:153 天
连续签到:5 天
2017-6-28 16:17:44 显示全部楼层
教程很好,,学习中,,
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2017-7-12 23:09:46 显示全部楼层
我在Linux下搭建环境的过程中遇到了各种各样的问题,还好,今天这些问题都解决了,可以比较愉快的看教程加练习了。
回复 支持 反对

使用道具 举报

尚未签到

2018-7-19 12:57:45 显示全部楼层
哦吼厉害了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了