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属性。
当然,如果你不声明这个属性,当整个程序关闭时,操作系统会回收内存。
因此我们所说的内存泄漏一般是指我们自己写的应用程序的内部,而不会影响到整个操作系统。

### Qt 框架简介 Qt 是一个功能全面、跨平台的应用程序开发框架,广泛应用于桌面应用、移动设备和嵌入式系统的开发。该框架采用 C++ 编写,同时也支持多种编程语言绑定,如 Python (通过 PyQt 或 PySide)[^5]。 #### 主要特点 1. **跨平台性** Qt 支持多个操作系统,包括 Windows、Linux、macOS 以及移动端的 Android 和 iOS 平台。这种跨平台的能力允许开发者编写一次代码即可部署到不同平台上运行[^1]。 2. **面向对象与模块化设计** 基于 C++ 的面向对象特性,Qt 提供了清晰的类层次结构和模块化的设计理念。这不仅提高了代码的可维护性和重用率,还便于开发者快速构建复杂的功能模块。 3. **信号与槽机制** 这一独特的通信方式让组件之间的交互变得简单而高效。无论是在 GUI 应用中处理按钮点击事件,还是在后台线程间传递数据,信号与槽都提供了灵活且安全的方式实现异步操作。 4. **图形视图框架** 使用 `QGraphicsScene`、`QGraphicsView` 和 `QGraphicsItem` 类组成的图形视图框架可以轻松管理和渲染大量二维图形项。这一框架非常适合需要动态绘制场景或动画效果的应用场合[^3]。 5. **多线程技术支持** 对于高性能需求的任务,比如网络请求或者文件 I/O 处理,Qt 提供了一套完善的多线程 API 来优化资源利用效率并提升用户体验。 6. **UI 设计工具——Qt Quick Designer** 针对现代化用户界面的需求,Qt 推出了基于声明式语言 QML 的 UI 开发环境 Qt Quick Designer。它允许设计师无需深入理解底层逻辑便能创造出流畅美观的操作界面[^4]。 7. **轻量化版本选项 —— QtLite** 当项目规模较小或硬件条件受限时,可以选择更加紧凑高效的子集方案 QtLite,在保持核心功能性的同时减少内存占用与编译时间成本[^2]。 8. **活跃社区生态与文档支持** 凭借多年积累下来的经验和技术沉淀,围绕着 Qt 形成了庞大的开源贡献者群体及其详尽的学习资料库,极大地方便了初学者入门学习以及高级工程师解决问题。 ```python import sys from PyQt5.QtWidgets import QApplication, QLabel app = QApplication(sys.argv) label = QLabel('Hello Qt!') label.show() sys.exit(app.exec_()) ``` 上述示例展示了如何使用 PyQt 创建简单的窗口显示文字 “Hello Qt!” ,体现了 Qt 易于使用的特质。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值