c++之QT

2023-11-11

Qt入门(C++)

1.Qt的优势:

1.跨平台,几乎支持所有的平台

2.接口简单,容易上手,学习QT框架对学习其他框架有参考意义

3.一定程度上简化了内存回收机制 (特定场景下会帮助释放内存)

4.开发效率高,能够快速的构建应用程序。

5.可以进行嵌入式开发

2.展示一个窗口

#include <iostream>
#include <QApplication>
#include <QWidget>

using namespace std;

int main(int argc, char *argv[]) {
    //创建Application对象
    QApplication app(argc, argv);
    //创建窗口
    QWidget w;
    //展示窗口
    w.show();

    //等待窗口关闭,程序结束
    return QApplication::exec();
}

3.Qt中的内存问题

Qt对象的父子关系:

QT最基础和核心的类是:QObjectQ…Object内部有一个list,会保存children,还有一个指针保存parent当自己析构时,会自己从parent列表中删除并且析构所有的children。

Qt的半自动化内存管理:

1、QObject及其派生类的对象,如果其parent非0,那么其parent析构时会析构 该对象。 2、QWidget及其派生类的对象,可以设置 Qt::WA_DeleteOnClose 标志位(当close时会析构该对象)。

attention:

父子关系:父对象、子对象、父子关系。这是Qt中所特有的,与类的继承关系无关,传递参数是与parent有关(基类、派生类,或父类、子类,这是对于派生体系来说的,与parent无关)

//main.cpp
#include <iostream>
#include <MainWindow.h>
#include <QApplication>

using namespace std;

int main(int argc, char *argv[]) {
    //创建Application对象
    QApplication app(argc, argv);
    //创建窗口对象
    MainWindow w;
     //设置窗口大小
    w.resize(500, 500);
    //显示窗口
    w.show();
    //窗口关闭后退出
    return QApplication::exec();
}

//MainWindow.cpp
#include "MainWindow.h"
#include <QWidget>

MainWindow::MainWindow(QWidget *parent) : QWidget(parent) {
    auto *button = new QPushButton;
    button->setText("按钮");
    button->setParent(this);
//      QPushButton *button = new QPushButton("按钮",this);
}

MainWindow::~MainWindow() = default;


//MainWindow.h
#ifndef BTN_MAINWINDOW_H
#define BTN_MAINWINDOW_H

#include <iostream>
#include <QWidget>
#include <QtWidgets/QPushButton>
using namespace std;
#include <QDebug>

class MainWindow : public QWidget {
public:
    explicit MainWindow(QWidget *parent = nullptr);

    ~MainWindow() override;

};
#endif //BTN_MAINWINDOW_H

4.信号和槽函数

1.信号和槽机制是 QT 的核心机制,它是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性.

2.信号和槽机制:

2.1信号和槽是用来在对象间传递数据的方法:当一个特定事件发生的时候,signal会被emit出来,slot调用是用来响应相应的signal.

2.2Qt中对象已经包含了许多预定义的 signal(基本组件都有各自特有的预定义的信号),Qt的对象中也已经包含了许多预定义的槽函数.

信号:

当对象的状态发生改变的时候,信号就由该对象发射 (emit) 出去

当一个信号被发射(emit),与其关联的槽函数被立刻执行,发射该信号的对象并不知道是那个对象在接收这个信号。这样保证了对象与对象之间的低耦合。

如果信号和多个槽函数相关联,当信号被发射时,这些槽的执行顺序将会是随机的、不确定的。

槽:

用于接受信号,而且槽只是普通的成员函数。当和槽连接的信号被发射时,槽会被调用。一个槽并不知道是否有任何信号与自己相连接。

信号和槽的绑定:

通过调用 QObject 对象的 connect 函数来将对象的信号与另外一个对象的槽函数相关联,当发射者发射信号时,接收者的槽函数将被调用

5窗口中添加一个按钮,点击按钮,窗口关闭

//MainWindow.cpp
MainWindow::MainWindow(QWidget *parent) : QWidget(parent) {
    auto *button = new QPushButton;
    button->setText("按钮");
    button->setParent(this);
    //信号和槽函数建立连接connect
    //参数1:发送信号者,参数2:传递的信号,信号3:接收信号者,参数4:槽函数
    connect(button,&QPushButton::clicked,QApplication::instance(),&QApplication::quit);
//      QPushButton *button = new QPushButton("按钮",this);
}

MainWindow::~MainWindow() = default;

在这里插入图片描述

qt项目的CMakeLists.txt的编写规则:

#cmake版本
cmake_minimum_required(VERSION 3.5.1)

#项目名称
project(LSPointCloudView)

#让cmake自动去寻找Qt5
FIND_PACKAGE(Qt5 COMPONENTS Widgets Network REQUIRED)
FIND_PACKAGE(PCL REQUIRED)
FIND_PACKAGE(Eigen3 REQUIRED)
FIND_PACKAGE(VTK REQUIRED)


#采用C++11标准
set(CMAKE_CXX_STANDARD 11)

#添加所有的源文件
file(GLOB LSPointCloudView_SOURCES ${PROJECT_SOURCE_DIR}/*.cpp )
#SET(LSPointCloudView_SOURCES
#   *.cpp
#)

#message("source file: ",${PROJECT_SOURCE_DIR})
#message("source file: ",${LSPointCloudView_SOURCES})
#添加所有的头文件
file(GLOB LSPointCloudView_HEADERS ${PROJECT_SOURCE_DIR}/*.h )
#SET(LSPointCloudView_HEADERS 
#*.h
#)

#添加所有的.ui文件
file(GLOB LSPointCloudView_FORMS ${PROJECT_SOURCE_DIR}/*.ui )
#SET(LSPointCloudView_FORMS 
#*.ui
#)

#添加资源文件
file(GLOB LSPointCloudView_RESOURCES ${PROJECT_SOURCE_DIR}/*.qrc )
#SET(LSPointCloudView_RESOURCES 
#	*.qrc
#)
#调用预编译器moc,需要使用 QT5_WRAP_CPP宏
QT5_WRAP_CPP(LSPointCloudView_HEADERS_MOC ${LSPointCloudView_HEADERS})
#使用uic处理.ui文件
QT5_WRAP_UI(LSPointCloudView_FORMS_HEADERS ${LSPointCloudView_FORMS})
#使用rcc处理.qrc文件
QT5_ADD_RESOURCES(LSPointCloudView_RESOURCES_RCC ${LSPointCloudView_RESOURCES})

#这些生成的中间文件都会在build目录下,这样的话,编译器则不能定位由uic程序产生的诸如_ui_mainwindow.h等文件。所以,我们需要把build目录添加到包含目录中
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})

#pcl
include_directories(${PCL_INCLUDE_DIRS})
# 设置依赖库链接目录
link_directories(${PCL_LIBRARY_DIRS})
# 添加预处理器和编译器标记
add_definitions(${PCL_DEFINITIONS})


#eigen3
include_directories(${EIGEN3_INCLUDE_DIR})

#vtk
include_directories(${VTK_INCLUDE_DIRS})
link_directories(${VTK_LIBRARY_DIRS})


#生成可执行文件
ADD_EXECUTABLE(LSPointCloudView 
	${LSPointCloudView_SOURCES} 
	${LSPointCloudView_HEADERS_MOC} 
        ${LSPointCloudView_FORMS_HEADERS}
	${LSPointCloudView_RESOURCES_RCC} 
)

#为target添加需要链接的共享库
TARGET_LINK_LIBRARIES(LSPointCloudView ${Qt5Widgets_LIBRARIES} ${PCL_LIBRARIES} ${VTK_LIBRARIES} -lpcap -lpthread)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++之QT 的相关文章

随机推荐

  • 红队隧道应用篇之Frp内网穿透(十)

    简介 Frp工具下载地址 https github com fatedier frp releases Frp可将处于防火墙或内网后的主机对外网提供http https tcp或udp等服务 例如在虚拟机做个frp内网穿透 在其他主机访问其
  • android gpuimage显示的缩放和剪裁模式

    原文 http blog csdn net u011270282 article details 51505755 在gpuimagerender里面有如下方法 GPUImage ScaleType CENTER CROP表示剪裁 可以修改
  • python二级题库 第四套 附刷题软件

    刷 题软件 模拟python二级考试 操作题刷题软件 公众h 露露IT 回复 python二级 一 选择题 1 描述数据库系统中全局数据逻辑结构 且为全体用户公共数据视图的是 A 概念模式 B 外模式 C 内模式 D 中间模式 解析 本题考
  • 使用yt_dlp下载油管视频

    yt dlp工具是一个开源的项目 项目地址 https github com yt dlp yt dlp 下载地址 https github com yt dlp yt dlp releases 查看支持的下载格式 yt dlp F htt
  • ztree中获取某节点的所有叶子节点

    var setting data simpleData enable true callback onClick treenodeClick function treenodeClick event treeId treeNode clic
  • vue数据双向绑定模型

    记录vue的数据双向绑定模型的常见的问题
  • 英文输入法

    注意 答案仅作为参考 实际考试中下列代码通过用例100 但不代表最优解 主管期望你来实现英文输入法单词联想功能 需求如下 依据用户输入的单词前缀 从已输入的英文语句中联想出用户想输入的单词 按字典序输出联想到的单词序列 如果联想不到 请输出
  • 微软 Office 中的零日漏洞: “ Follina”将在宏被禁用时工作

    信息安全网的研究人员在微软无处不在的 Office 软件中发现了一个零日代码执行漏洞 这个被称为 Follina 的漏洞已经流传了一段时间 网络安全研究员 Kevin Beaumont 追溯到4月12日微软的一份报告 并使用 Office
  • 深入理解Java虚拟机jvm-永久代(Permanent Generation)

    永久代 jdk6及以前 jdk7 jdk8 方法区 Method Area 与Java堆一样 是各个线程共享的内存区域 它用于存储已被虚拟机加载的类型信息 常量 静态变量 即时编译器编译后的代码缓存等数据 它和堆在逻辑上是连续的 但在物理上
  • Kubernetes (k8s) v1.19.0 安装部署,单机部署

    系统准备 环境准备 部署集群没有特殊说明均使用root用户执行命令 硬件信息 k8s master 内存16GB 硬盘20GB k8s 控制节点 Node节点 软件信息 CentOS Linux release 7 6 1810 Core
  • eclipse中server->runtime environment中没有出现jre

    一层层找 Windows gt server gt runtime environments 点击Edit 再点击installed JREs 再选中点击edit 选择自己电脑中jre的文件路径修改即可
  • 高通Vuforia+Unity——实现简单的AR功能

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 什么是AR 增强现实 Augmented Reality 简称AR 是一种将计算机生成的虚拟物体 场景或者系统提示信息叠加到真实场景中 从而时实现对现实的增强的一种技术
  • 锐捷防火墙(WEB)——VPN部署场景—VPN技术介绍

    目录 IPSec简介 应用场景 IPSEC VPN原理简介 数字证书原理简介 预共享密钥与数字证书的区别 主模式与野蛮模式的区别 SSL VPN简介 应用场景 SSL VPN原理简介 SSL VPN有三种工作模式 GRE简介 应用场景 功能
  • 【SLAM】libQGLViewer:VS 2019 + Qt 5.14.2 + Win 10 配置

    libQGLViewer 2 7 2 VS 2019 Qt 5 14 2 Win 10 配置 注意 这次配置没有完全成功 编译25个成功 一个失败 失败的是 qglviewerplugin qglviewerplugin 是一个可选控件 不
  • 数据倾斜的思路分析+map端join实现+倒排索引实现

    1什么是数据倾斜 解决解决方法 1让数据数据不要去reduceTask 在mapTask就进行处理 利用distributeCache map端join实现 public class MapSideJoin public static cl
  • 在ubuntu上安装ns2和nam(ubuntu16.04)

    在ubuntu上安装ns2和nam 版本选择 安装ns2 安装nam 版本选择 首先 版本的合理选择可以让我们避免很多麻烦 经过测试 ubuntu的版本选择为ubuntu16 04 ns2的版本选择为ns 2 35 nam包含于ns2 资源
  • MQTT.js 入门教程

    简介 MQTT js 是一个开源的 MQTT 协议的客户端库 使用 JavaScript 编写 主要用于 Node js 和 浏览器环境中 是目前 JavaScript 生态中使用最为广泛的 MQTT 客户端库 MQTT 是一种基于发布 订
  • .shp格式全国基础数据(公路、铁路、水系、国界、省界等)

    地级行政界线 zip 431 86 KB 下载次数 347 国界 zip 844 03 KB 下载次数 427 国界与省界 zip 1 11 MB 下载次数 366 三界以上河流 zip 1 42 MB 下载次数 370 首都和省级行政中心
  • [原创]Heroku 简单部署指南

    1 设置 1 1 环境依赖 1 2 Heroku 客户端安装 1 3 登录 2 应用 2 1 创建 2 2 查看日志 2 3 附加组件 2 4 交互式 Shell 2 5 定义 配置变量 2 6 配置数据库 2 7 Procfile 该部署
  • c++之QT

    Qt入门 C 1 Qt的优势 1 跨平台 几乎支持所有的平台 2 接口简单 容易上手 学习QT框架对学习其他框架有参考意义 3 一定程度上简化了内存回收机制 特定场景下会帮助释放内存 4 开发效率高 能够快速的构建应用程序 5 可以进行嵌入