一.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 中,表示菜单的类是QMenuBarQMenuBar代表的是窗口最上方的一条菜单栏。我们使用其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

 

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐