Hello,Qt5
2016-03-21 19:03
204 查看
在Ubuntu下开发Qt
由于在windows7下不知道为什么,程序的构建与调试十分慢,所以我转到ubuntu15.10下开发。不得不说,如果不是开发.Net程序的话,linux系统是最好的开发系统。但是在Ubuntu下我遇到了一个问题,官网下的QtCreater无法输入中文,按照网上说的下载fcitx什么什么之后,还是不能输入,最后我在ubuntu的software center下载了一个QtCreater,这次终于可以了。
一点新东西
我之前做过的图形界面都是使用C#+VisualStudio2013,相比之下最大的差别是Qt用了信号(SIGNAL)与槽(SLOT)机制来替代C#中的事件驱动,孰好孰坏我确实难以做出评价。这是我在学习Qt的道路上遇到的第一件新东西。一点困惑——QtCreater生成的文件结构和对象结构
让我们先通过QtCreater建立一个新项目开始。如图,我建立了一个helloqt的Qt项目,下面我们开始分析这个项目的文件结构以及其中生成的对象的关系。
1. 一切从main.cpp开始
在main.cpp中有以下代码
#include "dialog.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog w; w.show(); return a.exec(); }
第一行包含了一个名为dialog.h的头文件,后面再讲;
第二行包含了一个名为QApplication的类。这个类是必须加载的,因为在每一个使用Qt图形化应用程序中都必须使用一个QApplication对象。QApplication对象管理了各种各样的图形化应用程序的广泛资源、基本设置、控制流及事件处理等;
第三行是一个main函数,是应用程序的入口,几乎在所有使用Qt的情况下,main()函数只需要在将控制转交给Qt库之前执行初始化,然后Qt库通过事件向程序告知用户的行为。main函数的两个命令行参数的意义可参考Qt帮助文档;
第三行
QApplication a(argc, argv);初始化了一个QApplication对象a,在任何Qt的窗口系统部件被使用之前都必须创建QApplication对象,a在这里的作用是处理命令行参数;
第四行实例化了Dialog类;
第五行调用了Dialog类的show()方法;
第六行
return a.exec();程序进入消息循环,等待可能的输入进行响应。这里就是main()函数将控制器转交给Qt,Qt完成事件处理工作,当应用程序退出时,exec()函数的值就会返回。在exec()函数中,Qt接收并处理用户和系统的事件并将它们传递给适当的窗口部件。
2. 来看看dialog.h和dialog.cpp
在dialog.h文件中,代码如下:
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> namespace Ui { class Dialog; } class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(QWidget *parent = 0); ~Dialog(); private: Ui::Dialog *ui; }; #endif // DIALOG_H
在我写这篇文章的时候,还没有理解为什么要定义一个DIALOG_H,希望有理解的朋友能够告诉我。
然后代码中包含了一个QDialog类,这个类是一个Qt自己的类,我们自定义的Dialog继承了它。
然后定义了一个命名空间Ui,其中包含了一个类Dialog。
下面就是Dialog类的定义。
在该类的定义代码中,第一行有一个我还是不太理解的语法:Q_OBJECT,书上的解释是:Q_OBJECT宏的作用是启动Qt元对象系统的一些特性(如支持信号和槽等),它必须放置到类定义的私有区。
这句话还是基本能够理解,因为在C++语法中事没有signals和slots关键字的。但是在Qt中可以这样写:
class Dialog : public QDialog { Q_OBJECT private slots: functionA(); private signals: ...... public: explicit Dialog(QWidget *parent = 0); ~Dialog(); private: Ui::Dialog *ui; };
然后就是一些构造函数、析构函数和私有变量的定义。通过后面的学习我们会知道,如果我们的界面中要包含一些控件,就可以在这个头文件中定义。然后在dialog.cpp中进行初始化和实现。这样通过这个头文件我们就能知道应用程序中包含哪些控件,至于这些控件是怎么使用的,就可以在dialog.cpp文件中实现。
最后,我们看一下dialog.cpp文件
#include "dialog.h" #include "ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); } Dialog::~Dialog() { delete ui; }
对于ui对象的产生,是因为在创建项目是我选择了“创建界面”,然后QtCreater就自己创建了一个名为“界面文件”的文件夹,其中包含了名为“dialog.ui”的xml文件。这里对于ui对象的使用,我也不是很理解其语法,但是后面的大部分工作不会使用图形界面去设计界面,所以暂时放过吧。
这里就是Dialog类的构造函数的具体实现和其他成员函数的功能设计。在构造函数中,假设我们在dialog.h文件中的dialog类中定义了一个QLable变量指针:
QLable * helloLable;那么在这个dialog.cpp文件的构造函数中,我们就可以对其进行初始化:
hellolLable=new QLable(tr("Hello,Qt");
结语
本篇文章的主要目的是搞清楚QtCreater创建的文件结构,有助于我们分清楚各个类的关系。其中最主要的是理解main函数作为程序入口所做的工作,以及界面的控件在哪里定义,在哪里实现,至于基本的概念,不是本文的写作目的。相关文章推荐
- ubuntu 安装qt4
- Qt connect不明确
- QT中QMainWindow、QWidget、QDialog的区别
- Qt 窗体
- Qt不规则窗体的实现
- QT5.6.0 和 vs2013 联合编程
- QT---简单的猜数字游戏
- Qt入门-界面多语言国际化的实现
- Qt学习站点备忘
- QT + OpenGL
- QTableView 的使用
- QT Sn 2
- 用Qt加载一张图片----定时旋转图片
- Qt学习之QListWidget删除Item
- Qt文档中文版
- 关于“无法找到入口——无法定位程序输入点......于动态链接库QtCore4.dll上”的解决方案
- Qt正则表达式笔记
- Qt-----使用QJson库
- 笔记:QT的菜单
- QtCreator-----导入QJson库