当前位置: 首页 > news >正文

C/C++开发,opencv与qt结合播放视频

目录

一、qt_ui创建

        1.1 ui设置

         1.2 ui及代码输出保存

二、创建工程

        2.1 工程目录及编译设置

        2.2 源码设计

三、编译及测试

        3.1 程序编译

        3.2 程序运行


        首先声明,这是一个OpenCV 3学习文档的案例,但是说明有些过于省略,只有一些简短的代码描述,本人在学习验证过程中将其记录下来分享给大家。

一、qt_ui创建

        1.1 ui设置

        本文采用qt5.8_msvc2015_64版本,

        进入qt的bin目录,打开qt_ui设计工具designer.exe

         创建一个Widget窗体,即对象QWidget,命名为QMoviePlayer。

         随后创建一个QFrame对象,对象名为frame,该对象可以随意在窗体QMoviePlayer拉出一个合适的长宽比显示框,该显示框用来显示视频使用。

         完成设置后,保存该UI,例如QMoviePlayer.ui

         1.2 ui及代码输出保存

        本人的QMoviePlayer.ui文件的xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>QMoviePlayer</class><widget class="QWidget" name="QMoviePlayer"><property name="geometry"><rect><x>0</x><y>0</y><width>600</width><height>303</height></rect></property><property name="windowTitle"><string>Form</string></property><widget class="QFrame" name="frame"><property name="geometry"><rect><x>0</x><y>0</y><width>601</width><height>241</height></rect></property><property name="frameShape"><enum>QFrame::StyledPanel</enum></property><property name="frameShadow"><enum>QFrame::Raised</enum></property></widget></widget><resources/><connections/>
</ui>

        点击窗体菜单,进入查看代码,保存该代码文件为ui_QMoviePlayer.h,或新创建一个头文件将该内容直接复制到头文件中保存。

         本人的ui_QMoviePlayer.h的代码内容如下。

/********************************************************************************
** Form generated from reading UI file 'QMoviePlayerp15136.ui'
**
** Created by: Qt User Interface Compiler version 5.8.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/#ifndef QMOVIEPLAYERP15136_H
#define QMOVIEPLAYERP15136_H#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QFrame>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_QMoviePlayer
{
public:QFrame *frame;void setupUi(QWidget *QMoviePlayer){if (QMoviePlayer->objectName().isEmpty())QMoviePlayer->setObjectName(QStringLiteral("QMoviePlayer"));QMoviePlayer->resize(600, 303);frame = new QFrame(QMoviePlayer);frame->setObjectName(QStringLiteral("frame"));frame->setGeometry(QRect(0, 0, 601, 241));frame->setFrameShape(QFrame::StyledPanel);frame->setFrameShadow(QFrame::Raised);retranslateUi(QMoviePlayer);QMetaObject::connectSlotsByName(QMoviePlayer);} // setupUivoid retranslateUi(QWidget *QMoviePlayer){QMoviePlayer->setWindowTitle(QApplication::translate("QMoviePlayer", "Form", Q_NULLPTR));} // retranslateUi};namespace Ui {class QMoviePlayer: public Ui_QMoviePlayer {};
} // namespace UiQT_END_NAMESPACE#endif // QMOVIEPLAYERP15136_H

二、创建工程

        2.1 工程目录及编译设置

        创建一个opencv_qt目录的工程文件,工程组织如下:

opencv_qtbinbuild_vcsrcmain.cppui_QMoviePlayer.hQMoviePlayer.hQMoviePlayer.cppQMoviePlayer.uiCMakeLists.txt      #cmake工程vcbuild_2015.bat    #编译命令

        ui_QMoviePlayer.h和QMoviePlayer.ui就是前面采用designer.exe实现的ui及代码头文件。

        CMakeLists.txt文件内容如下,本文给出的有win/linux的痕迹,但是本文只实现了基于vc2015+qt_vc2015+opencv_vc的win编译方式,Linux下本文并没有进行测试,有兴趣的读者可以按该模块调整支持实现(关于opencv的Linux下库编译及调用案例看本专栏其他博文)。qt链接采用了动态库,opencv的基于vc2015编译出来的库本文时预先编译好的(C/C++开发,opencv在win下安装及应用_c++安装opencv库_py_free-物联智能的博客-CSDN博客)。

# CMake 最低版本号要求
cmake_minimum_required (VERSION 3.1.0)
# 项目信息
set(proname "opencv_qt")
project(${proname} VERSION 1.0.0 LANGUAGES CXX)if(WIN32)message(STATUS "windows compiling...")set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")add_definitions(-D_PLATFORM_IS_WINDOWS_-D_CRT_SECURE_NO_WARNINGS-D_WINSOCK_DEPRECATED_NO_WARNINGS# -DZLIB_WINAPI-DUNICODE-D_UNICODE# -DQT_DLL# -DQT_CORE_LIB# -DQT_GUI_LIB# -DQT_WIDGETS_LIB# -D CMAKE_CXX_FLAGS="/utf-8")else(WIN32)message(STATUS "linux compiling...")# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -I/usr/include -L/lib/x86_64-linux-gnu -lpthread -pthread -lm -lrt -ldl -lz -luuid ")  #qt需要-fPIC编译指定add_definitions(-D_PLATFORM_IS_LINUX_"-g"# "-std=gnu++0x""-std=c++11""-O2"# "-pipe""-Wno-invalid-source-encoding""-Wdeprecated-declarations""-W""-fPIC""-Wall"# "-Werror"# "-Wshadow"# "-Wformat"# "-Wpointer-arith""-D_REENTRANT"# "-D_USE_FAST_MACRO"# "-Wno-long-long"# "-Wuninitialized"# "-D_POSIX_PTHREAD_SEMANTICS"# "-Wno-unused-parameter""-fexceptions""-DQT_NO_DEBUG""-DDQT_QML_DEBUG")
endif(WIN32)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)if(CMAKE_VERSION VERSION_LESS "3.7.0")set(CMAKE_INCLUDE_CURRENT_DIR ON)
endif()set(EXECUTABLE_OUTPUT_PATH   ${PROJECT_SOURCE_DIR}/bin)
# 创建 EXECUTABLE_OUTPUT_PATH 指向的文件夹
execute_process( COMMAND ${CMAKE_COMMAND} -E make_directory ${EXECUTABLE_OUTPUT_PATH})set(PROJECT_CUR_DIR .)if(WIN32)
set(QTDIR "D:/workForSoftware/Qt/Qt5.8.0/5.8/msvc2015_64")
else(WIN32)
set(QTDIR "/opt/qt-5.8_static")
endif(WIN32)
message("QTDIR = ${QTDIR}")
set(Qt5_DIR "${QTDIR}/lib/cmake/Qt5")
message("Qt5_DIR  = ${Qt5_DIR}")set(CMAKE_AUTOMOC ON)
# set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
#查找需要的Qt库文件,最好每一个库都要写,Qt也会根据依赖关系自动添加
find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED)
cmake_policy(SET CMP0020 NEW)set(CMAKE_INCLUDE_CURRENT_DIR ON) #包含编译目录FILE(GLOB srcfile ${PROJECT_CUR_DIR}/src/*.h ${PROJECT_CUR_DIR}/src/*.cpp )             #加载文件夹下的所有源码文件
LIST(APPEND code_file ${srcfile} ) #变量合并include_directories("${PROJECT_CUR_DIR}""${PROJECT_CUR_DIR}/src""${PROJECT_CUR_DIR}/../../opencv_vc/include""${QTDIR}/include""${QTDIR}/include/QtCore""${QTDIR}/include/QtGui""${QTDIR}/include/QtWidgets"
)#link 目录
link_directories("${QTDIR}/lib""${PROJECT_CUR_DIR}/../../opencv_VC/x64/vc14/lib"
)message("RESOURCES = ${RESOURCES}")add_executable(${proname}  ${code_file} ${RESOURCES} ${RC_FILE} )# 链接指定
set(link_lib Qt5::Core Qt5::Gui Qt5::Widgets
)
if(WIN32)
if (CMAKE_BUILD_TYPE STREQUAL "release")
set(link_lib_opencv opencv_img_hash460.lib opencv_world460.lib
)
else()
set(link_lib_opencv opencv_img_hash460d.lib opencv_world460d.lib
)
endif()
endif(WIN32)target_link_libraries(${proname} ${link_lib}${link_lib_opencv}
)#去除 CMD 窗口
if(WIN32)
message("CMAKE_BUILD_TYPE =${CMAKE_BUILD_TYPE}")
if (CMAKE_BUILD_TYPE STREQUAL "release")
if(MSVC)set_target_properties(${proname} PROPERTIESWIN32_EXECUTABLE YESLINK_FLAGS "/ENTRY:mainCRTStartup")
elseif(CMAKE_COMPILER_IS_GNUCXX)SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows") # Not tested
else()message(SEND_ERROR "You are using an unsupported Windows compiler! (Not MSVC or GCC)")
endif(MSVC)
endif()endif(WIN32)

        vcbuild_2015.bat是为了编译方便创建的一个脚本,读者也可以按该脚本命令手动编译。

md build_vc
cd ./build_vc
@REM 单独编译时可能需要独立设置环境变量
if [%vccompilerversion%] EQU  [] ( set vccompilerversion="Visual Studio 14 2015 Win64" )@REM 工程配置
cmake -G %vccompilerversion% .. -DCMAKE_BUILD_TYPE=debug
@REM 编译
cmake --build . --config debug@REM 工程配置
cmake -G %vccompilerversion% .. -DCMAKE_BUILD_TYPE=release
@REM 编译
cmake --build . --config releasecd ..

        2.2 源码设计

        下来看看源码如何实现视频读取与播放的。

        QMoviePlayer.h内容如下,该头文件定义了一个窗口类型,该窗口显示部分来自于前面的UI设计“Ui::QMoviePlayer ui”,定义了“cv::VideoCapture m_cap”用来捕获视频内容:

#ifndef _QMOVIEPLAYER_H_
#define _QMOVIEPLAYER_H_#include "ui_QMoviePlayer.h"
#include <QtWidgets/QWidget>
#include <QImage>#include <opencv2/opencv.hpp>
#include <string>
using namespace std;QT_BEGIN_NAMESPACE
class QPaintEvent;
class QTimer;
QT_END_NAMESPACEclass QMoviePlayer : public QWidget 
{Q_OBJECTpublic:QMoviePlayer(QWidget *parent = NULL);virtual ~QMoviePlayer(){;}bool open( string file );public slots:void nextFrame();private:void paintEvent( QPaintEvent* q);void _copyImage( void);private:Ui::QMoviePlayer ui;    //ui界面cv::VideoCapture m_cap; //opencv的视频读取及捕获图像实现QImage m_qt_img;cv::Mat m_cv_img;       //图像缓存矩阵QTimer* m_timer;
};#endif //_QMOVIEPLAYER_H_

        QMoviePlayer.cpp内容如下,open函数用于打开一个视频文件,并通过QTimer对象来定期读取帧图像数据,nextFrame用于读取图像数据并更新到窗口显示;_copyImage函数是opencv与QT结合的关键,它将opencv捕获的图像m_cv_img转换为qt的图像m_qt_img,这样才能将图片按qt方式刷新到窗口显示:

#include "QMoviePlayer.h"#include <QPainter>
#include <QTimer>QMoviePlayer::QMoviePlayer(QWidget *parent): QWidget(parent)
{ui.setupUi( this );
}bool QMoviePlayer::open( string file)
{if( !m_cap.open( file)) return false;// If we opened the file, set up everything now://m_cap.read( m_cv_img );m_qt_img = QImage(QSize( m_cv_img.cols,m_cv_img.rows),QImage::Format_RGB888);ui.frame->setMinimumSize( m_qt_img.width(),m_qt_img.height());ui.frame->setMaximumSize( m_qt_img.width(),m_qt_img.height());_copyImage();m_timer = new QTimer( this );connect(m_timer, SIGNAL( timeout()), this, SLOT( nextFrame()) );m_timer->start( 1000.0 / m_cap.get( cv::CAP_PROP_FPS));return true;
}void QMoviePlayer::nextFrame()
{// Nothing to do if capture object is not open//if( !m_cap.isOpened()) return;m_cap.read(m_cv_img);if(m_cv_img.empty()) return;_copyImage();this->update();
}void QMoviePlayer::paintEvent( QPaintEvent* e )
{QPainter painter( this );painter.drawImage( QPoint( ui.frame->x(),ui.frame->y()),m_qt_img);
}void QMoviePlayer::_copyImage( void)
{// Copy the image data into the Qt QImage//cv::Mat cv_header_to_qt_image(cv::Size(m_qt_img.width(),m_qt_img.height()),CV_8UC3,m_qt_img.bits());cv::cvtColor(m_cv_img,cv_header_to_qt_image, cv::COLOR_BGR2RGB);
}

        main.cpp文件内容如下,就是qt程序启动后,调用前面定义的QMoviePlayer对象,读取视频文件(argv[1])及刷新显示:

#include <QApplication>
#include <QMoviePlayer.h>int main( int argc, char* argv[])
{QApplication app( argc, argv);QMoviePlayer mp;mp.open( argv[1]);mp.show();return app.exec();
}

三、编译及测试

        3.1 程序编译

        进入opencv_qt目录

        运行vcbuild_2015.bat,执行大致如下(本文是直接在vscode命令窗口执行):

        3.2 程序运行

         进入opencv_qt\bin\Debug,启动命令窗口运行是缺失qt动态库的,因此将qt动态库拷贝到该目录下运行,注意debug和release的区别,为了方便,本文把需要运行的视频文件也拷贝到了该目录下,如下图:

         启动命令窗口,并运行opencv_qt.exe

         程序启动,加载视频进行播放,如果不能正常播放,可以通过日志输出信息进行定位排查。

相关文章:

C/C++开发,opencv与qt结合播放视频

目录 一、qt_ui创建 1.1 ui设置 1.2 ui及代码输出保存 二、创建工程 2.1 工程目录及编译设置 2.2 源码设计 三、编译及测试 3.1 程序编译 3.2 程序运行 首先声明&#xff0c;这是一个OpenCV 3学习文档的案例&#xff0c;但是说明有些过于省略&#xff0c;只有一些简短的代码…...

磁共振图像处理中 fft1c 和 ifft1c 函数的 Python 实现

fft1c 和 ifft1c 是 MRI 图像处理的常用函数。通常使用如下的 Matlab 实现 &#xff08;Michael Lustig&#xff0c;2005&#xff09; function res ifft1c(x,dim)% res fft1c(x) % % orthonormal forward 1D FFT %nsize(x,dim); shftzeros(1,5); shft(dim)ceil(n/2);xcirc…...

阿里云国际站香港地域服务器访问延迟丢包的原因及解决方法

阿里云百科有2台香港地域的轻量应用服务器&#xff0c;国内使用发现Ping值延迟丢包严重&#xff0c;从大陆到香港访问是经过国际链路和运营商国际路由节点&#xff0c;会受到到国际链路拥塞&#xff0c;以及运营商出境路由限制&#xff0c;导致无法正常连接或访问某些网站&…...

GULI PART.1

文章目录 1、尚硅谷-谷粒学院1.1、系统功能模块介绍1.2、系统开发方式 2、Mybatis-Plus2.1、什么是 MyBatis&#xff1f;2.2、什么是Mybatis-Plus&#xff1f;2.3、Mybatis-plus 的特性2.4、支持的数据库 3、Mybatis-Plus入门3.1、创建表和数据3.2、创建SpringBoot工程3.3、安装…...

NetApp FAS2750 和 FAS2820:适用于分布式企业和从远程到核心的 FAS

NetApp FAS2750 和 FAS2820&#xff1a;适用于分布式企业和从远程到核心的 FAS 拥有分布式企业和多个办公位置的客户希望使用这些系统进行虚拟化&#xff0c;以及为大型 FAS 和 AFF 系统提供简单且经济高效的备份和灾难恢复。 为什么要从 NetApp FAS 系列中选择一个型号&…...

剑指YOLOv8改进最新MPDIoU损失函数:超越现有多种G/D/C/EIoU,23年7月首发论文,高效准确的边界框回归的损失

💡本篇内容:剑指YOLOv8改进最新MPDIoU损失函数:超越现有多种G/D/C/EIoU,23年7月首发论文,高效准确的边界框回归的损失 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 💡:重点:该专栏《剑指YOLOv8原创改进》只更新改进 YOLO…...

SQL-每日一题【1070. 产品销售分析 III】

题目 销售表 Sales&#xff1a; 产品表 Product&#xff1a; 编写一个 SQL 查询&#xff0c;选出每个销售产品 第一年 销售的 产品 id、年份、数量 和 价格。 结果表中的条目可以按 任意顺序 排列。 查询结果格式如下例所示&#xff1a; 示例 1&#xff1a; 解题思路 前置知…...

为何押注AI大模型的微软云,业绩增速反而不如谷歌云?

科技云报道原创。 上周微软、谷歌、Meta等国外科技公司相继发布最新财报。作为与人工智能、云计算和数字广告等领域相关的巨头&#xff0c;它们的一举一动都将对市场产生影响&#xff0c;同时也吸引着众多从业者的关注。 在国外三大云巨头中&#xff0c;谷歌云的市场份额长期…...

CDN加速服务的工作原理

CDN&#xff08;内容分发网络&#xff09;加速服务是一种用于提高网站和应用性能的技术&#xff0c;通过将内容分发到全球多个节点&#xff0c;使用户可以从就近的节点获取所需内容&#xff0c;从而实现更快的加载速度和更稳定的访问体验。下面详细介绍CDN加速服务的工作原理&a…...

在CSDN学Golang云原生(Kubernetes Service)

一&#xff0c;service的定义与基本用法 在 Kubernetes 中&#xff0c;Service 是一种抽象概念&#xff0c;用于定义一组 Pod 并为它们提供访问入口。通过 Service&#xff0c;您可以将多个 Pod 组合成一个逻辑单元&#xff0c;并使用标签选择器来确定哪些 Pod 属于该 Service…...

【数据结构篇C++实现】- 图

友情链接&#xff1a;C/C系列系统学习目录 文章目录 &#x1f680;一、图的基本概念和术语1、有向图和无向图3、基本图和多重图4、完全图5、子图6、连通、连通图和连通分量7、强连通图、强连通分量8、生成树、生成森林9、顶点的度、入度和出度10、边的权和网11、稠密图、稀疏图…...

Sentinel持久化规则

项目中有用到Sentinel,然后需要将Sentinel上配置的规则做持久化(或者初始化),通过改写Sentinel源码实现了需求,下面记录一下实现过程。 如果不知道Sentinel怎么搭,可以看看: 流控平台Sentinel搭建和接入教程_东皋长歌的博客-CSDN博客 一,背景 Sentinel是Alibaba开源…...

list与sort()

运行代码&#xff1a; //list与sort() #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;Item():name(" "),iid(0),value(0.0){}Item(string ss,int ii,double vv):name(ss),iid(ii),value(vv){}friend istre…...

6个月、21天,GoldenDB分布式数据库核心系统落地中移动

近日&#xff0c;2023“鼎新杯”数字化转型应用大赛入围名单公示&#xff0c;山东移动基于GoldenDB分布式数据库的CRM&BOSS核心系统自主创新实践成功入选。该项目是中兴通讯与中国移动在数据库关键领域的又一个合作范例。 核心系统业务量大&#xff0c;分布式转型迫在眉睫 …...

如何正确培养数据思维?

在大数据时代&#xff0c;数据思维已成了每个人的必备品。下面&#xff0c;我们就来了解一下&#xff0c;什么是数据思维。不过要想弄懂什么是数据思维&#xff0c;首先来打破大家对数据的错误认知&#xff0c;数据不仅仅指数字。 1. 数据思维是什么&#xff1f; 百度百科对数…...

JavaScript中的?.和??的用法

1、?.&#xff08;可选链运算符&#xff09; 在JavaScript中&#xff0c;"?.“是一种叫做"Optional Chaining”&#xff08;可选链&#xff09;的新操作符。它允许我们在访问一个可能为null或undefined的属性或调用一个可能不存在的方法时&#xff0c;避免出现错误…...

Git for linux

<1> linux 安装git sudo apt-get install git-all <2> 创建git&#xff0c;分为两部分&#xff0c;远程网络部分和本地主机部分 远程网路&#xff1a;登录GitHub: Let’s build from here GitHub 注册帐号&#xff0c;创建登录密码&#xff0c;此密码很长&a…...

uniapp小程序,根据小程序的环境版本,控制的显页面功能按钮的示隐藏

需求&#xff1a;根据小程序环境控制控制页面某个功能按钮的显示隐藏&#xff1b; 下面是官方文档和功能实现的相关代码&#xff1a; 实现上面需要&#xff0c;用到了uni.getAccountInfoSync()&#xff1a; uni.getAccountInfoSync() 是一个 Uniapp 提供的同步方法&#xff0c…...

kotlin 编写一个简单的天气预报app(二)增加搜索城市功能

增加界面显示openweathermap返回的信息。 在activity_main.xml里增加输入框来输入城市&#xff0c;在输入款旁边增加搜索按钮来进行查询。 然后原来显示helloworld的TextView用来显示结果。 1. 增加输入城市名字的EditText <EditTextandroid:id"id/editTextCity"…...

【分布鲁棒、状态估计】分布式鲁棒优化电力系统状态估计研究[几种算法进行比较](Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...