Qt简介

转自(稍作修改):http://devbean.blog.51cto.com/448512/193918

简介

Qt是一个著名的C++库——或许并不能说这只是一个GUI库,因为Qt十分庞大,并不仅仅是GUI。使用Qt,在一定程序上你获得的是一个“一站式”的服务:不再需要研究STL,不再需要C++的,因为Qt有它自己的QString等等。或许这样说很偏激,但Qt确实是一个“伟大的C++库”。
我们所使用的Qt,确切地说也就是它的GUI编程部分。

Qt有两套协议——商业版本和开源的LGPL版本。不同的是前者要收费,而后者免费,当然,后者还要遵循LGPL协议的规定。

下载完成后安装就可以了,其它不用管了。这样,整个Qt的开发环境就装好了——如果你需要的话,也可以把qmake所在的目录添加进环境变量,不过我就不做了。

安装完成后会有个Qt Creator,这就是官方提供的一个轻量级IDE,不过它的功能还是蛮强大的。
Qt不仅仅是Linux KDE桌面的底层实现库。而且是这个IDE的实现,这个IDE就是用Qt完成的。

系统默认为我们选择了Qt core 和 GUI,新建的是Gui Application,它会自动为我们加上gui这个库。
现在应该就能看出,Qt是多么庞大的一个库,它不仅仅有Gui,而且有Network,OpenGL,XML之类。

hello world

#include <QtGui/QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
        QApplication a(argc, argv);
        QLabel *label = new QLabel("Hello, world!");
        label->show();
        return a.exec();
}

对于label也可以如下写入:

QLabel *label=new QLabel("<h2><font color='red'>Hello</font>, world!<h2>");
label->show();

说明

QApplication对象

这个对象用于管理应用程序级别的资源。QApplication的构造函数要求两个参数,分别来自main的那两个参数,因此,Qt在一定程度上是支持命令行参数的。
大多数Qt程序使用QMainWindow或者QDialog作为顶级组件,但Qt并不强制要求这点。在这个例子中,顶级组件就是一个QLabel。

qmake

Qt的编译不能使用普通的make,而必须先使用qmake进行预编译。
所以,第一步应该是在工程目录下使用
qmake -project
命令创建.pro文件(比如说是叫helloworld.pro)。然后再在.pro文件目录下使用
qmake helloworld.pro (make)
或者
qmake -tp vc helloworld.pro (nmake)
生成makefile,然后才能调用make或者是nmake进行编译。
不过因为我们使用的是IDE,所以这些步骤就不需要我们手动完成了。

信号和槽机制

信号和槽

在Qt中我们有一种可以替代回调的技术。我们使用信号和槽。
当一个特定事件发生的时候,一个信号被发射。Qt的窗口部件有很多预定义的信号, 但是我们总是可以通过继承来加入我们自己的信号。
槽就是一个可以被调用处理特定 信号的函数。Qt的窗口部件又很多预定义的槽,但是通常的习惯是你可以加入自己的槽,这样你就可以处理你所感兴趣的信号。

你可以把许多信号和单一槽相连,并且一个信号也可以和许多槽相连,把一个信号和另一个信号直接相连也是可以的(这时,只要第一个信号被发射时,第二个信号立刻就被发射)。
总体来看,信号和槽构成了一个强有力的组件编程机制。

connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)

信号和槽-简单实例

#include <QApplication>

#include <QLabel>
#include <QPushButton>
#include <QObject>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPushButton button("buttontest");
    QObject::connect(&button, SIGNAL(clicked()), &a, SLOT(quit()));
    button.show();

    return a.exec();
}

这个例子就是QApplication的实例a说,如果button发出了clicked信号,你就去执行我的quit函数。所以,当我们点击button的时候,a的quit函数被调用,程序退出了。所以,在这里,clicked()就是一个信号,而quit()就是槽,形象地说就是把这个信号插进这个槽里面去。

QObject

QObject是所有类的根。Qt使用这个QObject实现了一个单根继承的C++。它里面有一个connect静态函数,用于连接信号槽。

Q_OBJECT

Q_OBJECT。这是一个宏。凡是定义信号槽的类都必须声明这个宏。

组件布局

3种layout

Qt提供了一种机制,就是布局。你只要把组件放入某一种布局之中,当需要调整大小或者位置的时候,Qt就知道该怎样进行调整。

Qt一共有三种主要的layout,分别是:
1. QHBoxLayout- 按照水平方向从左到右布局;
2. QVBoxLayout- 按照竖直方向从上到下布局;
3. QGridLayout- 在一个网格中进行布局。

layout使用addWidget添加组件,使用addLayout可以添加子布局,因此,这就有了无穷无尽的组合方式。

布局实例

#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>

#include <QLabel>
#include <QPushButton>

#include <QObject>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QLabel label("ld test");

    QPushButton button("buttontest");
    QObject::connect(&button, SIGNAL(clicked()), &a, SLOT(quit()));

    QWidget window;
    window.setWindowTitle("enter your age");

    //layout
    QHBoxLayout layout;
    layout.addWidget(&label);
    layout.addWidget(&button);

    //add layout
    window.setLayout(&layout);

    //show window
    window.show();

    return a.exec();
}

组件

QDialog 对话框

QWidget

QLabel

QPushButton

QSpinBox

QSlider

QCheckBox
The QCheckBox widget provides a checkbox with a text label.
A QCheckBox is an option button that can be switched on (checked) or off (unchecked). Checkboxes are typically used to represent features in an application that can be enabled or disabled without affecting others.

Qt 标准对话框

所谓标准对话框,其实就是Qt内置的一些对话框,主要有4个标准对话框:
1. QFileDialog:文件选择
2. QMessageBox:消息对话框
3. QInputDialog:输入对话框
4. QColorDialog:颜色选择对话框

QFileDialog

QFileDialog是Qt中用于文件打开和保存的对话框。

[static] QString QFileDialog::getOpenFileName(QWidget *parent = Q_NULLPTR, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = Q_NULLPTR, Options options = Options())

它是static的,所以我们能够使用类名直接访问。

用法如下:


  QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
                                                  "/home",
                                                  tr("Images (*.png *.xpm *.jpg)"));

FileDialog类也提供了保存对话框的函数getSaveFileName,具体使用还是请查阅API。

QMessageBox

消息对话框,基本用法如下:

  QMessageBox::information(NULL,"title",text,QMessageBox::Yes|QMessageBox::No);

QInputDialog

QInputDialog用于接收用户的输入。
QInputDialog提供了一些简单的static函数(QInputDialog::getText()),用于快速的建立一个对话框。

  bool is_ok;
  QString text=QInputDialog::getText(NULL,"input dialog","please input your comment",QLineEdit::Normal,"your comment",&is_ok);
  QMessageBox::information(NULL,"title",text,QMessageBox::Yes|QMessageBox::No);

QColorDialog

颜色选择对话框。
Qt提供了getColor()函数,类似于QFileDialog的getOpenFileName(),可以直接获得选择的颜色。

parent参数

程序写的多了,你会发现几乎所有的Qt类的构造函数都会有一个parent参数。这个参数通常是QObject* 或者是 QWidget* 类型的。很多情况下它都会有一个初始值0(NULL),因此,即便你不去给它赋值也没有丝毫的问题。于是,稍微偷懒一下,就会不自觉的忽略了这个参数。那么,这个参数到底是干什么用的呢?

其实,这个参数有很多用处。
就像它的名字一样,这个参数指定了组件的父组件
1. 对于一个对话框来说,对话框一般是不作为顶层容器出现的,因此在任务栏上一般是没有对话框的位置的。
怎么指定这个对话框不是顶层容器呢?有父组件的组件不就不是顶层容器了吗?
因此,只要你指定对话框的parent属性,任务栏就不会出现它的身影。
当然,如果你不指定,这个对话框就成为顶层容器了,任务栏会给它留个位置。
利用这个特性,就可以实现特殊对话框可以在任务栏出现的效果,比如“关于”对话框的出现。
2. 另外比较通用,也是很重要的作用是,parent参数指明了组件的父组件,
这样,当父组件delete时,Qt可以保证所有子组件——也就是parent指针指向这个组件的所有组件——都会被正确的delete掉。
这是Qt能够帮助我们管理一部分内存的原因所在。
Qt是通过遍历parent属性来防止了这一部分内存泄漏的。
因此,必要情况下还是不要忘记设置这个parent属性。
当然,如果你不声明这个属性,当整个程序关闭时,操作系统会回收内存。
因此我们所说的内存泄漏一般是指我们自己写的应用程序的内部,而不会影响到整个操作系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值