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)