Hello,Qt5
来源:互联网 发布:淘宝联系卖家的软件 编辑:程序博客网 时间:2024/06/11 09:14
在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_OBJECTpublic: 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_OBJECTprivate 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函数作为程序入口所做的工作,以及界面的控件在哪里定义,在哪里实现,至于基本的概念,不是本文的写作目的。
- Hello,Qt5
- QT5.2.1 hello QT!
- QT5 Hello Word!
- 《Qt5学习笔记2》第一个Qt5程序Hello Qt!
- VS2012+Qt5.1配置及入门(hello world)
- QT5.9.1入门一:GUI的hello world
- qt5
- qt5
- QT5
- paip.最新的c++ qt5.1.1环境搭建跟hello world
- Ubuntu 12.04创建第一个Qt5小程序(qmake编译Hello World)
- hello?
- hello
- hello
- hello
- hello
- hello
- Hello
- Easy Image 使用总结
- BZOJ2705Longge的问题
- java验证码
- get 与 post
- 递归归并排序和非递归归并排序(自然分组)
- Hello,Qt5
- 三角形
- 如何将参数传递给CGI程序(转)
- JS处理日期时间戳
- 基于CXF Java 搭建Web Service (Restful Web Service与基于SOAP的Web Service混合方案)
- kernel里获取uboot的环境变量
- 终极结束进程方法API
- MVC里面两个dropdownlist联动
- @protocol 代理模式总结