您的位置:首页 > 编程语言 > Qt开发

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函数作为程序入口所做的工作,以及界面的控件在哪里定义,在哪里实现,至于基本的概念,不是本文的写作目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: