Qt6+VTK9环境配置

news2024/11/14 12:17:35

Qt6+VTK9环境配置

  • 说明
  • 1 Qt6安装
  • 2 VTK源码编译
    • 2.1 源码下载
    • 2.2 工程编译
    • 2.3 设置环境变量
  • 3 Qt+VTK项目构建
    • 3.1 使用qmake管理项目
    • 3.2 使用cmake管理项目
  • 参考资料

说明

由于想做一点新的东西,需要去探索一些工具,对于VTK之前没有了解过,在进行环境配置时,参考了其他一些博客,由于版本的问题,采了不少坑,所以,在这里做个记录整理。我所使用的工具版本如下:

QtVTK
6.5.39.3.0

友情提示: 如果您也是新手,建议和我保持一样的版本,Qt6还好,VTK相对于之前的版本(如8.x),更新非常大,有很多地方都不一样,会有很多麻烦。

1 Qt6安装

Qt的安装没什么好说的,根据官方提供的连接,下载安装即可,如果之前没有用过Qt,进行安装。

2 VTK源码编译

2.1 源码下载

由于要和Qt一起使用,官方提供的安装包和vcpkg安装的不包括Qt相关的库,所以要从源码进行编译。VTK源码地址。进入github后,选择版本,然后下载即可。
1 选择版本

2.2 工程编译

下载好后,打开cmake-gui。选择源码路径和build文件路径(在源码同级路径下新建文件夹即可),忽略文件夹版本和代码版本不对应的问题,配环境真的很头大。
在这里插入图片描述
先点击Configure,页面出现如下界面,选择visual Studio 17 2022(我的vs是2022)和x64,然后Finish进行生成编译文件。
在这里插入图片描述
结束后,勾选BUILD_SHARED_LIBS,找到CMAKE_INSTALL_PREFIX,设置一个vtk的库文件生成路径。
在这里插入图片描述
在这里插入图片描述

然后在后面找到VTK_GROUP_ENABLE_Qt,将条件值设置为WANT
在这里插入图片描述
然后重新Configure,会出现如下错误提示
在这里插入图片描述
然后将VTK_QT_VERSION的值改为‘6’,将Qt6_DIR改为自己Qt安装路径下编译套件lib文件夹下的cmake/Qt6文件夹,Qt5的路径不用管,设置完成后再Configure。
在这里插入图片描述
在这里插入图片描述
完成后检查,若Qt的各个路径只有Qt6QmlCompilerPlusPrivate_DIR-NOTFOUND,则完成,Qt6QmlCompilerPlusPrivate这个不用管,没有影响。
在这里插入图片描述
然后,点击Generate进行生成。完成后Open Project便可操作。
在这里插入图片描述
点击Open Project,在visual Studio中打开项目。打开后将项目的编译类型设置成Release,在右侧资源管理器中,右击ALL_BUILD,开始编译。
在这里插入图片描述
在这里插入图片描述
编译完成后,同样在资源管理器中找到INSTALL,右键生成进行安装,完整完成后会在之前设置的vtk库文件生成路径下生成vtk库。
在这里插入图片描述
在这里插入图片描述
到这里,vtk库编译完成。

2.3 设置环境变量

在系统环境变量里增加vtk的bin路径
在这里插入图片描述

3 Qt+VTK项目构建

完成环境配置后,构建Qt+VTK项目进行环境测试,Qt项目有两种管理方式,基于qmake和基于cmake。

3.1 使用qmake管理项目

使用Qtcreator创建一个Qt Widgets Application项目,使用qmake管理项目。
在这里插入图片描述
在这里插入图片描述
打开项目.pro文件,将内容改为如下:

QT       += core gui openglwidgets   #openglwidgets必不可少,不然会报opengl相关的错误

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

# Assign include header path
INCLUDEPATH += path/VTK/include
# Assign lib search path
QMAKE_LIBDIR += path/VTK/lib

# Set link lib
LIBS +=vtkcgns-9.3.lib\
    vtkChartsCore-9.3.lib\
    vtkCommonColor-9.3.lib\
    vtkCommonComputationalGeometry-9.3.lib\
    vtkCommonCore-9.3.lib\
    vtkCommonDataModel-9.3.lib\
    vtkCommonExecutionModel-9.3.lib\
    vtkCommonMath-9.3.lib\
    vtkCommonMisc-9.3.lib\
    vtkCommonSystem-9.3.lib\
    vtkCommonTransforms-9.3.lib\
    vtkDICOMParser-9.3.lib\
    vtkDomainsChemistry-9.3.lib\
    vtkDomainsChemistryOpenGL2-9.3.lib\
    vtkdoubleconversion-9.3.lib\
    vtkexodusII-9.3.lib\
    vtkexpat-9.3.lib\
    vtkFiltersAMR-9.3.lib\
    vtkFiltersCellGrid-9.3.lib\
    vtkFiltersCore-9.3.lib\
    vtkFiltersExtraction-9.3.lib\
    vtkFiltersFlowPaths-9.3.lib\
    vtkFiltersGeneral-9.3.lib\
    vtkFiltersGeneric-9.3.lib\
    vtkFiltersGeometry-9.3.lib\
    vtkFiltersGeometryPreview-9.3.lib\
    vtkFiltersHybrid-9.3.lib\
    vtkFiltersHyperTree-9.3.lib\
    vtkFiltersImaging-9.3.lib\
    vtkFiltersModeling-9.3.lib\
    vtkFiltersParallel-9.3.lib\
    vtkFiltersParallelImaging-9.3.lib\
    vtkFiltersPoints-9.3.lib\
    vtkFiltersProgrammable-9.3.lib\
    vtkFiltersReduction-9.3.lib\
    vtkFiltersSelection-9.3.lib\
    vtkFiltersSMP-9.3.lib\
    vtkFiltersSources-9.3.lib\
    vtkFiltersStatistics-9.3.lib\
    vtkFiltersTemporal-9.3.lib\
    vtkFiltersTensor-9.3.lib\
    vtkFiltersTexture-9.3.lib\
    vtkFiltersTopology-9.3.lib\
    vtkFiltersVerdict-9.3.lib\
    vtkfmt-9.3.lib\
    vtkfreetype-9.3.lib\
    vtkGeovisCore-9.3.lib\
    vtkgl2ps-9.3.lib\
    vtkglew-9.3.lib\
    vtkGUISupportQt-9.3.lib\
    vtkGUISupportQtQuick-9.3.lib\
    vtkGUISupportQtSQL-9.3.lib\
    vtkhdf5-9.3.lib\
    vtkhdf5_hl-9.3.lib\
    vtkImagingColor-9.3.lib\
    vtkImagingCore-9.3.lib\
    vtkImagingFourier-9.3.lib\
    vtkImagingGeneral-9.3.lib\
    vtkImagingHybrid-9.3.lib\
    vtkImagingMath-9.3.lib\
    vtkImagingMorphological-9.3.lib\
    vtkImagingSources-9.3.lib\
    vtkImagingStatistics-9.3.lib\
    vtkImagingStencil-9.3.lib\
    vtkInfovisCore-9.3.lib\
    vtkInfovisLayout-9.3.lib\
    vtkInteractionImage-9.3.lib\
    vtkInteractionStyle-9.3.lib\
    vtkInteractionWidgets-9.3.lib\
    vtkIOAMR-9.3.lib\
    vtkIOAsynchronous-9.3.lib\
    vtkIOCellGrid-9.3.lib\
    vtkIOCesium3DTiles-9.3.lib\
    vtkIOCGNSReader-9.3.lib\
    vtkIOChemistry-9.3.lib\
    vtkIOCityGML-9.3.lib\
    vtkIOCONVERGECFD-9.3.lib\
    vtkIOCore-9.3.lib\
    vtkIOEngys-9.3.lib\
    vtkIOEnSight-9.3.lib\
    vtkIOERF-9.3.lib\
    vtkIOExodus-9.3.lib\
    vtkIOExport-9.3.lib\
    vtkIOExportGL2PS-9.3.lib\
    vtkIOExportPDF-9.3.lib\
    vtkIOFDS-9.3.lib\
    vtkIOFLUENTCFF-9.3.lib\
    vtkIOGeometry-9.3.lib\
    vtkIOHDF-9.3.lib\
    vtkIOImage-9.3.lib\
    vtkIOImport-9.3.lib\
    vtkIOInfovis-9.3.lib\
    vtkIOIOSS-9.3.lib\
    vtkIOLegacy-9.3.lib\
    vtkIOLSDyna-9.3.lib\
    vtkIOMINC-9.3.lib\
    vtkIOMotionFX-9.3.lib\
    vtkIOMovie-9.3.lib\
    vtkIONetCDF-9.3.lib\
    vtkIOOggTheora-9.3.lib\
    vtkIOParallel-9.3.lib\
    vtkIOParallelXML-9.3.lib\
    vtkIOPLY-9.3.lib\
    vtkIOSegY-9.3.lib\
    vtkIOSQL-9.3.lib\
    vtkioss-9.3.lib\
    vtkIOTecplotTable-9.3.lib\
    vtkIOVeraOut-9.3.lib\
    vtkIOVideo-9.3.lib\
    vtkIOXML-9.3.lib\
    vtkIOXMLParser-9.3.lib\
    vtkjpeg-9.3.lib\
    vtkjsoncpp-9.3.lib\
    vtkkissfft-9.3.lib\
    vtklibharu-9.3.lib\
    vtklibproj-9.3.lib\
    vtklibxml2-9.3.lib\
    vtkloguru-9.3.lib\
    vtklz4-9.3.lib\
    vtklzma-9.3.lib\
    vtkmetaio-9.3.lib\
    vtknetcdf-9.3.lib\
    vtkogg-9.3.lib\
    vtkParallelCore-9.3.lib\
    vtkParallelDIY-9.3.lib\
    vtkpng-9.3.lib\
    vtkpugixml-9.3.lib\
    vtkRenderingAnnotation-9.3.lib\
    vtkRenderingCellGrid-9.3.lib\
    vtkRenderingContext2D-9.3.lib\
    vtkRenderingContextOpenGL2-9.3.lib\
    vtkRenderingCore-9.3.lib\
    vtkRenderingFreeType-9.3.lib\
    vtkRenderingGL2PSOpenGL2-9.3.lib\
    vtkRenderingHyperTreeGrid-9.3.lib\
    vtkRenderingImage-9.3.lib\
    vtkRenderingLabel-9.3.lib\
    vtkRenderingLICOpenGL2-9.3.lib\
    vtkRenderingLOD-9.3.lib\
    vtkRenderingOpenGL2-9.3.lib\
    vtkRenderingQt-9.3.lib\
    vtkRenderingSceneGraph-9.3.lib\
    vtkRenderingUI-9.3.lib\
    vtkRenderingVolume-9.3.lib\
    vtkRenderingVolumeOpenGL2-9.3.lib\
    vtkRenderingVtkJS-9.3.lib\
    vtksqlite-9.3.lib\
    vtksys-9.3.lib\
    vtkTestingCore-9.3.lib\
    vtkTestingRendering-9.3.lib\
    vtktheora-9.3.lib\
    vtktiff-9.3.lib\
    vtktoken-9.3.lib\
    vtkverdict-9.3.lib\
    vtkViewsContext2D-9.3.lib\
    vtkViewsCore-9.3.lib\
    vtkViewsInfovis-9.3.lib\
    vtkViewsQt-9.3.lib\
    vtkWrappingTools-9.3.lib\
    vtkzlib-9.3.lib



SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

然后打开ui文件,在页面中添加一个widget,然后点击右键选择提升为输入QVTKOpenGLNativeWidget,其提升为QVTKOpenGLNativeWidget,然后进行编译。
在这里插入图片描述
修改mainwindow.cpp文件,添加测试代码

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkNamedColors.h>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>
#include <vtkGenericOpenGLRenderWindow.h>


#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());

    vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New();

    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();

    vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();

    sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
    vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New();

    sphereActor->SetMapper(sphereMapper);
    //sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(sphereActor);
    renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());

    vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetWindowName("RenderWindowNoUIFile");


    renderWindow->AddRenderer(renderer);
    renderWindow->SetWindowName("RenderWindowNoUIFile");
    auto renW=ui->widget;
    renW->setRenderWindow(renderWindow);

}

MainWindow::~MainWindow()
{
    delete ui;
}

运行,出现如下结果。
在这里插入图片描述

3.2 使用cmake管理项目

操作同上,创建新项目,选择cmake管理,然后修改cmake文件如下:

cmake_minimum_required(VERSION 3.16)

project(vtk_cmake VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

#find package vtk
set(VTK_DIR "path/VTK/lib/cmake/vtk-9.3")
find_package(VTK 9.3 REQUIRED)

set(PROJECT_SOURCES
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(vtk_cmake
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET vtk_cmake APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
    if(ANDROID)
        add_library(vtk_cmake SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(vtk_cmake
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(vtk_cmake PRIVATE Qt${QT_VERSION_MAJOR}::Widgets
                                         Qt${QT_VERSION_MAJOR}::OpenGL
                                        ${VTK_LIBRARIES})

vtk_module_autoinit(TARGETS vtk_cmake MODULES ${VTK_LIBRARIES})

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
  set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.vtk_cmake)
endif()
set_target_properties(vtk_cmake PROPERTIES
    ${BUNDLE_ID_OPTION}
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

include(GNUInstallDirs)
install(TARGETS vtk_cmake
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(vtk_cmake)
endif()

和上述一样,在ui文件中添加widget并将其提示为QVTKOpenGLNativeWidget。然后修改mainwindow.cpp,添加测试代码。

#include "mainwindow.h"
#include "./ui_mainwindow.h"

#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkNamedColors.h>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>
#include <vtkGenericOpenGLRenderWindow.h>


#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);

MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent)
   , ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());

   vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New();

   vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();

   vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();

   sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
   vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New();

   sphereActor->SetMapper(sphereMapper);
   //sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());

   vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
   renderer->AddActor(sphereActor);
   renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());

   vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
   renderWindow->AddRenderer(renderer);
   renderWindow->SetWindowName("RenderWindowNoUIFile");


   renderWindow->AddRenderer(renderer);
   renderWindow->SetWindowName("RenderWindowNoUIFile");
   auto renW=ui->widget;
   renW->setRenderWindow(renderWindow);
}

MainWindow::~MainWindow()
{
   delete ui;
}

运行,出现如下结果。
在这里插入图片描述

参考资料

1.https://blog.csdn.net/caoshangpa/article/details/135420524?ops_request_misc=%257B%2522request%255Fid%2522%253A%25223F73871A-85DF-4616-9606-7A4C8ABEE5DA%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=3F73871A-85DF-4616-9606-7A4C8ABEE5DA&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-135420524-null-null.142v100pc_search_result_base3&utm_term=qt6%E5%AE%89%E8%A3%85&spm=1018.2226.3001.4187
2.https://blog.csdn.net/weixin_43470971/article/details/127352193
3.https://blog.csdn.net/u014170067/article/details/141529399

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis缓存和数据库通过延迟双删除实现数据一致性

为了提高查询的效率&#xff0c;我们经常会用到redis缓存&#xff0c;但是使用redis缓存就不可避免缓存一致性的问题。 先删缓存&#xff0c;再更新数据 如果并发查询可能会再删除缓存后&#xff0c;还没有更新数据库的时候&#xff0c;第二个线程读取到旧数据&#xff0c;并…

尚品汇-商品上下架完善(更新ES)、延迟消息(四十四)

目录&#xff1a; &#xff08;1&#xff09;改造商品搜索上下架 &#xff08;2&#xff09;延迟消息 &#xff08;1&#xff09;改造商品搜索上下架 定义商品上下架常量 在rabbit-util模块中导入常量类MqConst。 /*** 商品上下架.*/ public static final String EXCHANGE…

游戏翻译中西班牙语的特点

由于西班牙语丰富的文化多样性和广泛的使用&#xff0c;将游戏翻译成西班牙语带来了独特的机遇和挑战。西班牙语是全球第二大使用语言&#xff0c;包括西班牙、拉丁美洲和美国部分地区在内的各个地区有超过4.6亿母语人士。然而&#xff0c;这些地区的语言和文化差异需要量身定制…

Datawhale X 李宏毅苹果书 AI夏令营-深度学习进阶task1:局部极小值与鞍点,批量和动量

一、临界点和鞍点 在做优化的时候经常会发现&#xff0c;随着参数不断更新&#xff0c;训练的损失不会再下降, 但是我们对这个损失仍然不满意或者有时模型一开始就训练不起来&#xff0c;不管我们怎么更新参数&#xff0c;损失都降不下去。 过去常见的一个猜想是我们优化到某…

GPU环境配置:1.CUDA、Anaconda、Pytorch

一、查看显卡适配CUDA型号 查看自己电脑的显卡版本&#xff1a; 在 Windows 设置中查看显卡型号&#xff1a;使用 Windows I 快捷键打开「设置」&#xff0c;依次点击「系统」-「屏幕」和「高级显示器设置」&#xff0c;在「显示器 1」旁边就可以看到显卡名称。 右键点菜单图标…

自动生成对话视频!如何使用Captions的AI视频生成与编辑API工具?

Captions公司最近发布了一套AI驱动的视频生成和编辑API工具&#xff0c;为创作者和开发者提供了一个强大的视频创作生态系统。这个系统包含AI Creator、AI Twin、AI Edit、和AI Translate四大核心功能&#xff0c;每个工具都针对不同的创作需求进行优化。下面我们就一起来详细测…

宏定义## 的使用

宏定义## 的使用 C语言中宏定义## 的使用 宏定义## 的使用 #define LV_color(x,y,z) x##y##z 文章目录 宏定义## 的使用宏定义## 的使用 宏定义## 的使用 #include<stdio.h> #include<stdlib.h>#define LV_color(x,y,z) x##y##z int main() {printf("LV_col…

SaaS行业|深入探讨五个联盟营销平台

随着数字时代的飞速发展&#xff0c;SaaS&#xff08;Software as a Service&#xff0c;软件即服务&#xff09;行业正以前所未有的速度崛起&#xff0c;成为推动全球商业变革的重要力量。本文将深入探索分析SaaS行业的五个营销联盟营销平台。 1. PartnerShare&#xff1a;Saa…

保姆级Vue项目安装配置步骤(包含vue-cli脚手架环境配置、Vue项目创建、运行)

文章目录 1. Vue-cli脚手架安装2. Vue项目创建(使用图形化界面创建步骤&#xff09;3. Vue项目-运行4. Vue项目-配置端口 此教程摘选自我的笔记&#xff1a;黑马JavaWeb开发笔记08——(保姆级Vue项目全部安装配置步骤)Vue-cli脚手架安装、NodeJS环境搭建、Vue项目的创建、运行、…

zdppy+vue3+onlyoffice文档管理系统实战 20240903 上课笔记 登录功能完成

接下来 1、注销功能&#xff1a;点击注销按钮&#xff0c;清除登录信息跳转到登录页面2、token过期 注销功能 useUser.js import storage from "../../g/storage.js"; import {useRouter} from "vue-router"; import {message} from "ant-design-…

【vue Lottie】lottie在vue项目中的使用心得

✨减少依赖体积 ●能用原生实现的动效&#xff0c;就不要切Lottie&#xff0c;提前做好切分 ●使用的时候&#xff0c;不要一股脑的复制粘贴过来&#xff0c;而是应该进行如下步骤的清洗 ○合并同样的图片依赖素材&#xff0c;减小依赖图片的大小 ○一些很大的背景图片&…

比亚迪夏亮相,枪口究竟对准了谁?

文/王俣祺 导语&#xff1a;比亚迪的MPV终于要来了&#xff0c;比亚迪夏在成都车展上正式亮相&#xff0c;据说售价会在30万级别&#xff0c;如果是这一几个区间&#xff0c;可以说是把矛头直接指向了腾势D9。作为比亚迪“宗亲”的腾势D9匆忙表示“大哥别开枪&#xff0c;自己人…

多晶透明陶瓷市场发展现状和前景:未来几年年复合增长率CAGR为15.5%

多晶透明陶瓷是一种新型先进功能材料&#xff0c;它具有独特的机械性能和透射性能&#xff0c;在战略和民用领域有着广泛的应用。陶瓷粉末合成、成型和烧结技术的进步使得先进透明陶瓷材料的微观结构、机械性能和光学性能关系的定制成为可能。透明陶瓷材料大致分为可见光、中波…

【qt】多线程实现倒计时

1.界面设计 设置右边的intvalue从10开始倒计时 2.新建Thread类 新建Thread类&#xff0c;使其继承QThread类&#xff0c;多态重写run函数&#xff0c;相当于线程执行函数 3.重写run函数 重写run函数&#xff0c;让另一个进程每隔1s发出一个信号&#xff0c;主线程使用conne…

wireshark使用攻略

简介 wireshark 是网络封包分析工具&#xff0c;可与截取各种网络数据包并且显示数据包的详细信息。 使用 打开wireshark &#xff1a; 在Linux中使用sudo wireshark 打开 打开之后选择对应的网卡&#xff0c;就可以进行网络信息的捕获&#xff0c;开始抓取网络包。 可以…

不管C盘垃圾有多少 芝麻清理就是好!彻底清理电脑垃圾!

不管C盘垃圾有多少 芝麻清理就是好&#xff01;彻底清理电脑垃圾&#xff01;让你没烦恼&#xff01;C盘垃圾是许多人的烦恼&#xff0c;如果靠手动去清理C盘垃圾是个非常麻烦的事情&#xff0c;就算有10多年电脑经验的高手&#xff0c;也未必能做到彻底清理干净C盘。 对于我们…

Allure报告下载不同格式的文件

支持类型&#xff1a; class AttachmentType(Enum):def __init__(self, mime_type, extension):self.mime_type mime_typeself.extension extensionTEXT ("text/plain", "txt")CSV ("text/csv", "csv")TSV ("text/tab-sep…

网络编程9月3日

1&#xff0c;思维导图2&#xff0c;TCP通信 服务器端 #include<myhead.h> #define JCHM 4514 #define IPDZ "192.168.0.113" #define BACKLOG 5 int main(int argc,const char *argv[]) {int oldfdsocket(AF_INET,SOCK_STREAM,0);if(oldfd-1){perror("…

猴子排序:一种理论上的排序算法

猴子排序&#xff1a;一种理论上的排序算法 在编程和算法的世界里&#xff0c;总有一些有趣的算法让人忍俊不禁&#xff0c;同时又让人深思。今天&#xff0c;我们来聊聊一种特别的排序算法——猴子排序&#xff08;Bogosort&#xff09;&#xff0c;也常被戏称为瞎子排序、波…

解放你的带宽和内存:GZIP在解决Redis大Key方面的应用

首发公众号&#xff1a;赵侠客 引用 目前主流HTTP协议接口都是使用JSON格式做数据交换的&#xff0c;JSON数据格式有着结构简单、可读性高、跨平台&#xff0c;易解析等优点&#xff0c;同时也存在着冗余数据会占用非常多的储存空间的问题&#xff0c;这大大增加了JSON格式数据…