c++之QT

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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值