Hello,Qt5

在Ubuntu下开发Qt

由于在windows7下不知道为什么,程序的构建与调试十分慢,所以我转到ubuntu15.10下开发。不得不说,如果不是开发.Net程序的话,linux系统是最好的开发系统。
但是在Ubuntu下我遇到了一个问题,官网下的QtCreater无法输入中文,按照网上说的下载fcitx什么什么之后,还是不能输入,最后我在ubuntu的software center下载了一个QtCreater,这次终于可以了。

一点新东西

我之前做过的图形界面都是使用C#+VisualStudio2013,相比之下最大的差别是Qt用了信号(SIGNAL)与槽(SLOT)机制来替代C#中的事件驱动,孰好孰坏我确实难以做出评价。这是我在学习Qt的道路上遇到的第一件新东西。

一点困惑——QtCreater生成的文件结构和对象结构

让我们先通过QtCreater建立一个新项目开始。
Hello,Qt5_第1张图片
如图,我建立了一个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++语法中事没有signalsslots关键字的。但是在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函数作为程序入口所做的工作,以及界面的控件在哪里定义,在哪里实现,至于基本的概念,不是本文的写作目的。

你可能感兴趣的:(C++,图形界面,qt,跨平台,qt5)