Qt入门学习——Qt快速入门(vim纯代码编写)

27 篇文章 1 订阅

original url:

http://blog.csdn.net/tennysonsky/article/details/47981259


写代码前,先需搭建环境,详情请看:《Qt 5.4.2 ubuntu环境搭建》


一个简单空白窗口

打开终端,通过vim first_qt.cpp新建文件,由于Qt代码为C++代码,所以,新建文件的后缀为.cpp



代码内容如下:

[cpp]  view plain copy
  1. #include <QApplication>  
  2. #include <QWidget>  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication app(argc, argv); //初始化  
  7.       
  8.     QWidget w;  
  9.     w.show();  
  10.       
  11.     app.exec(); //主事件循环  
  12.       
  13.     return 0;  
  14. }  

写完代码后,我们需要通过g++编译器(C++编译器)把此代码编译为可执行程序,但由于此代码使用的函数不是C++标准库,而是Qt库,编译时需要指定其所依赖的Qt库,这样比较麻烦。我们可以利用Qt提供的qmake工具来编译Qt的源代码


qmake所在目录:



配置环境变量,PATH添加qmake路径:

1)复制qmake所在的目录


2)在 ~/.bashrc 或/etc/profile 脚本最后的位置添加如下代码(/home/mike/Qt5.4.2/5.4/gcc_64/bin 为qmake所在目录,不同环境有所差异):

export PATH=/home/mike/Qt5.4.2/5.4/gcc_64/bin:$PATH




3)运行脚本文件,让设置的环境变量立马生效(source ~/.bashrc),通过which qmake 查看是否设置成功:



接下来,我们通过qmake工程先自动生成工程文件,再通过工程文件生成Makefile,再通过make解析Makefile的指令把源代码编译成可执行程序:

1)生成所需工程文件:qmake -project

qmake工具会根据当前目录源代码自动生成一个后缀为.pro的工程文件,文件名字和当前目录名相同。



打开工程文件,其内容如下:


工程文件简单分析:

1)TEMPLATE:为建立目标文件而采用何种模板。

app, 为建立一个Qt应用程序创建 Makefile文件;

lib, 为建立应用程序库而创建 Makefile 文件。

2)TARGET:描述了目标文件的名称(即可执行文件名)。默认=.pro文件名称=工程目录名。

3)INCLUDEPATH:描述了编译该工程时编译器需要搜索的头文件的路径。

4)#:注释代码

5)HEADERS:告诉编译器,.h 文件路径及其文件文件(这里没有使用到)。

6)SOURCES:告诉编译器, 源代码(.cpp文件)文件路径及其文件名字。

7)FORMS:添加 designer 生成的 .ui 文件(这里没有使用到)。


此工程文件缺少一个很重要的东西:模块的添加。Qt 5 定义了多个模块,每个模块包含相对独立的库文件并实现各自的功能,如果不在工程文件添加相应模块,就算代码编写正确,编译时也会提示很多函数或类未定义。而这里,我们写的代码主要涉及到图形界面,故需在工程文件添加 QtWidgets 模块:QT += widgets



2)根据工程文件用qmake命令生成Makefile:qmake



3)使用生成的Makefile编译源代码:make


4)运行可执行程序:./qt



Qt代码基本框架介绍

我们以后写Qt代码时基本上都看到这个一个框架:


1)包含所需头文件:通常和使用到的类同名,Qt的类名通常以‘Q’开头。


2)初始化:创建一个QApplication对象并将用户输入参数传递给它,每一个Qt GUI应用程序都有且只有一个QApplication对象,而且是在定义其他对象之前定义即是说,通常main()中的第一句话通常都是:QApplication app(argc, argv);)。它主要用于管理Qt GUI应用程序的控制流程和主要的设置选项,是每个Qt GUI应用程序所必需的。


3)主事件循环:app.exec()是每个Qt应用程序都要调用的函数。程序运行停在这里等待事件(如键盘事件或鼠标事件)的发生,等待用户来操作窗口。


而我们写的代码又是什么意思呢?

QWidget w; //QWidget是Qt窗口基类,根据QWidget创建一个对象w,既是说w是一个窗口对象。

w.show();//窗口创建默认是隐藏的,需要调用show()才能显示出来


Qt程序的外观通常是由各个不同的类的对象组成。


父窗口添加子部件

接下来,我们在原来的空白窗口上添加一个按钮,这里通过指定父对象的方式实现,其流程如下:

1)创建所需按钮

2)按钮指定窗口为其父对象,即按钮放在窗口上

3)显示按钮


修改后的代码如下:

[cpp]  view plain copy
  1. #include <QApplication>  
  2. #include <QWidget>  
  3. #include <QPushButton> //按钮所需头文件  
  4.   
  5. int main(int argc, char *argv[])  
  6. {  
  7.     QApplication app(argc, argv); //初始化  
  8.       
  9.     QWidget w;  
  10.     w.show();  
  11.       
  12.     //新增的代码  
  13.     //创建一个内容为"^_^"的按钮,需要头文件:#include <QPushButton>  
  14.     QPushButton button("^_^");   
  15.       
  16.     //按钮指定窗口为其父对象,即按钮放在窗口上  
  17.     button.setParent(&w);  
  18.       
  19.     button.show(); //显示按钮  
  20.       
  21.       
  22.     app.exec(); //主事件循环  
  23.       
  24.     return 0;  
  25. }  

接下来,敲make重新编译代码,运行结果如下:



A部件指定B部件为其父对象,我们看到的直接效果为A部件放在B部件的上面,其实,指定父对象还有如下作用:

1)父对象show的时候会递归调用其所有子对象,让它们都显示出来。

2)父对象被销毁时会递归销毁其所有的子对象,让内存管理更加的简单。


指定父对象主要有两种方式:1)调用setParent()函数 2)创建新部件时通过给构造函数传参指定。


完善后的代码如下:

[cpp]  view plain copy
  1. #include <QApplication>  
  2. #include <QWidget>  
  3. #include <QPushButton> //按钮所需头文件  
  4.   
  5. int main(int argc, char *argv[])  
  6. {  
  7.     QApplication app(argc, argv); //初始化  
  8.       
  9.     QWidget w;  
  10.       
  11.     //创建一个内容为"^_^"的按钮,需要头文件:#include <QPushButton>  
  12.     //通过给构造函数传参指定w为其父对象  
  13.     QPushButton button("^_^", &w);   
  14.   
  15.     w.show(); //显示父窗口,父窗口上的部件也会跟着显示  
  16.       
  17.     app.exec(); //主事件循环  
  18.       
  19.     return 0;  
  20. }  

程序运行效果和上面一样。


Qt标准程序结构分析

我们写Qt程序,基本上不可能只有一个.cpp文件,也不可能把所有的代码都放在main()中,通常我们需要分文件。


下面的例子由 main.cpp mywidget.cpp mywidget.h 组成:



main.cpp内容如下:

[cpp]  view plain copy
  1. #include <QApplication>  
  2. #include "mywidget.h"//自定义类的头文件  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     MyWidget w; //创建MyWidget的对象  
  8.     w.show();  
  9.   
  10.     return a.exec();  
  11. }  

mywidget.h内容如下:

[cpp]  view plain copy
  1. #ifndef MYWIDGET_H  
  2. #define MYWIDGET_H  
  3.   
  4. #include <QWidget>  
  5. #include <QPushButton>//按钮所需头文件  
  6.   
  7. //MyWidget公有继承于QWidget,既是说MyWidget也是一个窗口类  
  8. class MyWidget : public QWidget  
  9. {  
  10. public:  
  11.     MyWidget(QWidget *parent = 0);//参数主要用于给基类构造函数传参  
  12.     ~MyWidget(); //析构函数  
  13.       
  14.     QPushButton button;//定义一个按钮对象  
  15.       
  16. };  
  17.   
  18. #endif // MYWIDGET_H  

mywidget.cpp内容如下:

[cpp]  view plain copy
  1. #include "mywidget.h"  
  2.   
  3. //构造函数  
  4. MyWidget::MyWidget(QWidget *parent)  
  5.     : QWidget(parent)//通过参数列表给基类构造函数传参  
  6. {  
  7.     button.setText("^_^"); //设置按钮的内容"^_^"  
  8.       
  9.     //指定父对象  
  10.     //this指向主函数( main() )的对象w  
  11.     //最终button放在w窗口的上面  
  12.     button.setParent(this);  
  13. }  
  14.   
  15. //析构函数  
  16. MyWidget::~MyWidget()  
  17. {  
  18.   
  19. }  

程序结构说明:

1)main.cpp 内创建MyWidget的对象

2)mywidget.h 内声名函数、变量及其它的类的对象或对象指针

3)mywidget.cpp 内进行函数实现、创建对象

4)一般窗口类都要继承QWidget


程序运行结果如下:


本教程示例代码下载请点击此链接:http://download.csdn.net/detail/tennysonsky


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值