QT学习
1.qt vs tools 插件安装包及教程https://www.cnblogs.com/WindSun/p/12182536.html2.
一.qt vs tools 插件安装包及教程
https://www.cnblogs.com/WindSun/p/12182536.html
二:创建项目以及相关文件夹
https://blog.csdn.net/lhl1124281072/article/details/80028936
二.OT学习之路笔记
https://www.devbean.net/2012/08/qt-study-road-2-catelog/
1 Qt简介:
Qt是一个跨平台的框架,跨平台GUI通常有三种实现策略:
- API映射:界面库使用同一套API,将其映射到不同的底层平台上面,例如Mac OS和WIndows,相当于将不同平台的API提取公共部分。
- .API模拟:API映射会“缺失“不同平台的特定功能,使用模拟,会将不同平台的有差异的API,使用工具库自己模拟出来。
- GUI模拟:任何平台都提供了图形绘制函数,例如画点,划线,画画等,有些工具库利用这些基本函数,在不同绘制出自己的组件。
Ot优点:
Ot也是一个标准的C++库。但是它的语法十分清晰,使用信息槽机制
Qt缺点:
使用Qt的moc对程序进行预处理,才能够使用标准的make或者nmake进行正常的编译,并且信息槽的调用要比普通的函数调用蛮大约一个数量级。
2.Hello,world
搭建Qt环境:
Qt官方下载网站:http://qt-project.org/downloads
Qt SDK:包含了Qt库以及Qt的开发工具
Qt Library:仅包含Qt库,升级SDK中提供的Qt库版本,需要安装,之后在IDE中配置安装路径。
Qt Creator:基于Qt构建的一个轻量级IDE
3.信息槽
所谓信息槽就是观察者模式,当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号,类似于广播,如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,用自己的一个函数(成为槽)来处理这个信号。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPushButton button("Quit");
QObject::connect(&button, &QPushButton::clicked, &QApplication::quit);
button.show();
Mysolution1 w;
w.show();
return a.exec();
}
解释:
使用重载:QMetaObject::Connection connect(const QObject *, PointerToMemberFunction, Functor);
connect()一般会使用前面四个参数,第一个是发出信号的对象,第二个是发送对象发出的信号,第三个是接收信号的对象,第四个是接收对象在接收到信号之后所需要调用的函数。也就是说,当 sender 发出了 signal 信号之后,会自动调用 receiver 的 slot 函数。
在这里,sender类型是&button,signal的类型是&QPushButton,最后一个参数是QApplication的static函数quit(),也就是说,当我们的button发出了clicked()信号时,会调用QApplication的quit()函数,使程序退出。
4.自定义信息槽
例如在报纸和订阅者之间,有一个报纸类Newspaper,还有一个订阅者类Subsriber,Subscriber可以订阅Newspaper,观察者是Subscriber,被观察者是Newspaper,观察者会将自身注册到被观察者的一个容器中(比如subscriber.registerTo(newspaper))。被观察者发生了任何变化的时候,会主动遍历这个容器,依次通知各个观察者(newspaper.notifyAllSubscribers())。
代码及备注:
///////////////newspaper.h//////////////////////
#pragma once
#include<QObject>
class Newspaper :public QObject
//Newspaper这个类继承了QObject类的类,才具有信息槽的能力
{
Q_OBJECT
//第一行必写,这个宏的展开将为我们的类提供信息槽机制,国际化机制以及Qt提供的不基于C++RTTI,这个宏将由moc做特殊处理,moc会取读标记了Q_OBJECT的头文件,生成以moc_为前缀的文件。
public:
Newspaper(const QString & name) :
m_name(name)
{
}
void send()
{
emit newPaper(m_name);
//emit的含义是发出,也就是发出newPaper()信号,将以报纸的名字m_name当作参数传给这个信号.
}
signals:
//列出该类的信息,信息就是一个个的函数名,moc会帮我们实现信息函数所需的函数体
void newPaper(const QString& name);
private:
QString m_name;
};
///////////////reader.h//////////////////////
#pragma once
#include<QObject>
#include<Qdebug>
class Reader :public QObject
{
Q_OBJECT
public:
Reader() {}
void receiveNewspaper(const QString& name)
//接受信息的类
{
qDebug() << "Receives Newspaper:" << name;
//输出函数调试值
}
};
///////////////main.h//////////////////////
#include<QCoreApplication>
#include"newspaper.h"
#include"reader.h"
int main(int argc, char* argv[])
{
QCoreApplication app(argc, argv);
//创建了一个QApplication对象,对象名为app,带两个参数argc,argv
Newspaper newspaper("Newspaper A");//创建两个对象
Reader reader;
QObject::connect(&newspaper, &Newspaper::newPaper, &reader, &Reader::receiveNewspaper);
//链接信息和槽
newspaper.send();
//调用Newspaper的send()函数,由于我们的连接,当这个信号发出时,自动调用 reader 的槽函数,打印出语句。
return
app.exec();
//程序进程的开始
}
5.Qt 模块简介
Qt5引入了模块化的慨念,将众多功能细分到几个模块之中,基础模块为Essentials Modules,扩展模块是Add-on Modules:
基础模块(Essentials Modules):
- Qt Core:提供核心的非GUI功能,所有模块都需要这个模块。这个模块的类包括了动画框架、定时器、各个容器类、时间日期类、事件、IO、JSON、插件机制、智能指针、图形(矩形、路径等)、线程、XML 等。所有这些类都可以通过 <QtCore> 头文件引入。
- Qt Gui:提供GUI程序的基本功能,包括与窗口系统的集成,事件处理,OpenGL 和 OpenGL ES 集成、2D 图像、字体、拖放等。这些类一般由 Qt 用户界面类内部使用,当然也可以用于访问底层的 OpenGL ES 图像 API。Qt Gui 模块提供的是所有图形用户界面程序都需要的通用功能。
- Qt Multimedia:提供视频、音频、收音机以及摄像头等功能。这些类可以通过 <QtMultimedia> 引入,而且需要在 pro 文件中添加 QT += multimedia。
- Qt Network,提供跨平台的网络功能。这些类可以通过 <QtNetwork> 引入,而且需要在 pro 文件中添加 QT += network
- Qt Qml,提供供 QML(一种脚本语言,也提供 JavaScript 的交互机制) 使用的 C++ API。这些类可以通过 <QtQml> 引入,而且需要在 pro 文件中添加 QT += qml。
- Qt Quick,允许在 Qt/C++ 程序中嵌入 Qt Quick(一种基于 Qt 的高度动画的用户界面,适合于移动平台开发)。这些类可以通过 <QtQuick> 引入,而且需要在 pro 文件中添加 QT += quick。
- Qt SQL,允许使用 SQL 访问数据库。这些类可以通过 <QtSql> 引入,而且需要在 pro 文件中添加 QT += sql
- Qt Test,提供 Qt 程序的单元测试功能。这些类可以通过 <QtTest> 引入,而且需要在 pro 文件中添加 QT += testlib。
- Qt Webkit,基于 WebKit2 的实现以及一套全新的 QML API
Qt 扩展模块(Add-on Modules):
- Qt 3D,提供声明式语法,在 Qt 程序中可以简单地嵌入 3D 图像。Qt 3D 为 Qt Quick 添加了 3D 内容渲染。Qt 3D 提供了 QML 和 C++ 两套 API,用于开发 3D 程序。
- Qt Bluetooth,提供用于访问蓝牙无线设备的 C++ 和 QML API。
- Qt Contacts,用于访问地址簿或者联系人数据库的 C++ 和 QML API。
- Qt Concurrent,封装了底层线程技术的类库,方便开发多线程程序。
- Qt D-Bus,这是一个仅供 Unix 平台使用的类库,用于利用 D-Bus 协议进行进程间交互。
- Qt Graphical Effects,提供一系列用于实现图像特效的类,比如模糊、锐化等
- Qt Image Formats,支持图片格式的一系列插件,包括 TIFF、MNG、TGA 和 WBMP。
- Qt JS Backend,该模块没有公开的 API,是 V8 JavaScript 引擎的一个移植。这个模块仅供 QtQml 模块内部使用。
- Qt Location,提供定位机制、地图和导航技术、位置搜索等功能的 QML 和 C++ API。
- Qt OpenGL,方便在 Qt 应用程序中使用 OpenGL。该模块仅仅为了程序从 Qt 4 移植到 Qt 5 的方便才保留下来,如果你需要在新的 Qt 5 程序中使用 OpenGL 相关技术,需要使用的是 QtGui 模块中的 QOpenGL。
- Qt Organizer,使用 QML 和 C++ API 访问组织事件(organizer event)。organizer API 是 Personal Information Management API 的一部分,用于访问 Calendar 信息。通过 Organizer API 可以实现:从日历数据库访问日历时间、导入 iCalendar 事件或者将自己的事件导出到 iCalendar。
- Qt Print Support,提供对打印功能的支持。
- Qt Publish and Subscribe,为应用程序提供对项目值的读取、导航、订阅等的功能。
- Qt Quick 1,从 Qt 4 移植过来的 QtDeclarative 模块,用于提供与 Qt 4 的兼容。如果你需要开发新的程序,需要使用 QtQuick 模块。
- Qt Script,提供脚本化机制。这也是为提供与 Qt 4 的兼容性,如果要使用脚本化支持,请使用 QtQml 模块的 QJS* 类。
- Qt Script Tools,为使用了 Qt Script 模块的应用程序提供的额外的组件
- Qt Sensors,提供访问各类传感器的 QML 和 C++ 接口。
- Qt Service Framework,提供客户端发现其他设备的服务。Qt Service Framework 为在不同平台上发现、实现和访问服务定义了一套统一的机制。
- Qt SVG,提供渲染和创建 SVG 文件的功能
- Qt System Info,提供一套 API,用于发现系统相关的信息,比如电池使用量、锁屏、硬件特性等。
- Qt Tools,提供了 Qt 开发的方便工具,包括 Qt CLucene、Qt Designer、Qt Help 以及 Qt UI Tools 。
- Qt Versit,提供了对 Versit API 的支持。Versit API 是 Personal Information Management API 的一部分,用于 QContacts 和 vCard 以及 QOrganizerItems 和 iCalendar 之间的相互转换。
- Qt Wayland,仅用于 Linux 平台,用于替代 QWS,包括 Qt Compositor API(server)和 Wayland 平台插件(clients)。
- Qt WebKit,从 Qt 4 移植来的基于 WebKit1 和 QWidget 的 API。
- Qt Widgets,使用 C++ 扩展的 Qt Gui 模块,提供了一些界面组件,比如按钮、单选框等。
- Qt XML,SAX 和 DOM 的 C++ 实现。该模块已经废除,请使用 QXmlStreamReader/Writer。
- Qt XML Patterns,提供对 XPath、XQuery、XSLT 和 XML Schema 验证的支持
备注:Qt的扩展模块并不是Qt必须安装的部分,未来会有更多的扩展模块
下面是专门供 Windows 平台的模块:
- QAxContainer,用于访问 ActiveX 控件。
- QAxServer,用于编写 ActiveX 服务器。
下面是专门供 Unix 平台的模块:
- QtDBus,使用 D-Bus 提供进程间交互。
6.mainWindow简介
QMainWindow是Qt框架带来的一个预定义好的主窗口类

备注:对于一般的 Qt 应用程序,我们所需要做的,就是编写我们的主窗口代码,主要是向其中添加各种组件,比如菜单、工具栏等,当然,最重要的就是当中的工作区。当我们将这些都处理完毕之后,基本上程序的工具也可以很好地实现。
7.添加动作
Qt使用QAction类作为动作:
QAction包含了图标、菜单文字、快捷键、状态栏文字、浮动帮助等信息。当把一个QAction对象添加到程序中时,Qt 自己选择使用哪个属性来显示,无需我们关心。同时,Qt 能够保证把QAction对象添加到不同的菜单、工具栏时,显示内容是同步的。也就是说,如果我们在菜单中修改了QAction的图标,那么在工具栏上面这个QAction所对应的按钮的图标也会同步修改。
如何在QMainWindow中使用QAction:
//////////////////////mainwindow.h///////////////////////
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private:
void open();//私有函数
QAction *openAction;//私有变量
};
#endif // MAINWINDOW_H
///////////////////////mainwindow.h//////////////////////////
#include <QAction>
#include <QMenuBar>
#include <QMessageBox>
#include <QStatusBar>
#include <QToolBar>
#include "mainwindow.h"
MainWindow::MainWindow(QWidget* parent) :
QMainWindow(parent)
{
setWindowTitle(tr("Main Window"));//设置主窗口标题,tr()函数,这是一个用于 Qt 国际化的函数
openAction = new QAction(QIcon("./icon1.ico"), tr("&Open..."), this);
//我们在堆上创建了openAction对象。在QAction构造函数,我们传入了一个图标、一个文本和 this 指针
//QAction第二个参数中,文本值前面有一个 &,意味着这将成为一个快捷键
openAction->setShortcuts(QKeySequence::Open);
//我们使用了setShortcut()函数,用于说明这个QAction的快捷键,Qt 的QKeySequence为我们定义了很多内置的快捷键,比如我们使用的 Open
openAction->setStatusTip(tr("Open an existing file"));
//setStatusTip()则实现了当用户鼠标滑过这个 action 时,会在主窗口下方的状态栏显示相应的提示。
connect(openAction, &QAction::triggered, this, &MainWindow::open);
//co。nnect()函数,将这个QAction的triggered()信号与MainWindow类的open()函数连接起来。当用户点击了这个QAction时,会自动触发MainWindow的open()函数。
QMenu *file = menuBar()->addMenu(tr("&File"));
file->addAction(openAction);
QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);
statusBar();
//menuBar()、toolBar()和statusBar()三个是QMainWindow的函数,用于创建并返回菜单栏、工具栏和状态栏
//我们向菜单栏添加了一个 File 菜单,并且把这个QAction对象添加到这个菜单;同时新增加了一个 File 工
//具栏,也把QAction对象添加到了这个工具栏。我们可以看到,在菜单中,这个对象被显示成一个菜单项,在工具栏变成了一个按钮
}
MainWindow::~MainWindow()
{
}
void MainWindow::open()
{
QMessageBox::information(this, tr("Information"), tr("Open"));
}
//////////////////////////main.cpp///////////////////////////
#include<QCoreApplication>
#include"newspaper.h"
#include"reader.h"
#include"mainwindow.h"
#include"mainwindow.cpp"
int main(int argc, char* argv[])
{
QCoreApplication app(argc, argv);//创建了一个QApplication对象,对象名为app,带两个参数argc,argv
MainWindow win;
win.show();
return app.exec();//程序进程的开始
}
7.菜单栏、工具栏和状态栏
Qt 将用户与界面进行交互的元素抽象为一种“动作”,使用QAction类表示,QAction可以添加到菜单上、工具栏上,在实际开发过程中,QMainWindow通常只作为“主窗口”,对话框窗口则更多地使用QDialog类。我们会在后面看到,QDialog类会缺少一些QMainWindow类提供方便的函数,比如menuBar()以及toolBar()。Qt 中,表示菜单的类是QMenuBar。QMenuBar代表的是窗口最上方的一条菜单栏。我们使用其addMenu()函数为其添加菜单。尽管我们只是提供了一个字符串作为参数,但是 Qt 为将其作为新创建的菜单的文本显示出来。至于 & 符号,我们已经解释过,这可以为菜单创建一个快捷键。当我们创建出来了菜单对象时,就可以把QAction添加到这个菜单上面,也就是addAction()函数的作用。
QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);
QToolBar *toolBar2 = addToolBar(tr("Tool Bar 2"));
toolBar2->addAction(openAction);
使用QAction::setStatusTip()可以设置该动作在状态栏上的提示文本,QMainWindow::menuBar(),QMainWindow有一个statusBar()函数。让我们把这个函数添加上去:
QToolBar *toolBar2 = addToolBar(tr("Tool Bar 2"));
toolBar2->addAction(openAction);
statusBar();
8.对话框简介
Qt 中使用QDialog类实现对话框。就像主窗口一样,我们通常会设计一个类继承QDialog。
更多推荐



所有评论(0)