QT C++实现点击按键弹出窗口并显示图片/视频|多窗口应用程序的设计和开发
一、介绍
首先,QT界面开发中主要大体分为2种多窗口的形式:
- 嵌入式:
新生成的窗口嵌入在主窗口内部 - 独立窗口:
以弹窗形式的新窗口生成和展示


这里就讲解最简单的:点击案件后,跳出一个新窗口
二、代码实现
要在Qt C++中实现点击按钮后显示新窗口,并在新窗口中显示由主程序生成的图片,你需要创建两个窗口类:主窗口类和图片显示窗口类。下面是一个简单的示例,展示了如何实现这一功能:
创建一个新的Qt Widgets Application。
添加两个窗口类,一个是主窗口类 MainWindow,另一个是显示图片的窗口类 ImageWindow。
一般用vs2019开发,创建Qt Widgets Application之后,会自带一个和项目名同名的主窗口类。这个时候需要手动创建另外一个,即新窗口类。创建方法可以参考这篇博客:Qt5.12.6 + VS2019 点击按钮弹出新窗口
首先是 ImageWindow 类的实现(假设图片使用 QLabel 来显示):
imagewindow.h:
#ifndef IMAGEWINDOW_H
#define IMAGEWINDOW_H#include <QWidget>
#include <QLabel>class ImageWindow : public QWidget
{Q_OBJECTpublic:explicit ImageWindow(QWidget *parent = nullptr);void displayImage(const QPixmap &pixmap);private:QLabel *imageLabel;};#endif // IMAGEWINDOW_H
imagewindow.cpp:
#include "imagewindow.h"
#include <QVBoxLayout>ImageWindow::ImageWindow(QWidget *parent) : QWidget(parent)
{imageLabel = new QLabel;QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(imageLabel);setLayout(layout);
}void ImageWindow::displayImage(const QPixmap &pixmap)
{imageLabel->setPixmap(pixmap);
}
然后是主窗口类 MainWindow,当点击按钮时,将创建图片显示窗口的实例,并显示图片:
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QPushButton>
#include "imagewindow.h"class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);private slots:void on_showImageButton_clicked();private:QPushButton *showImageButton;ImageWindow *imageWindow;
};#endif // MAINWINDOW_H
mainwindow.cpp:
#include "imagewindow.h"ImageWindow::ImageWindow(QWidget *parent) : QWidget(parent)
{imageLabel = new QLabel(this); // 使用 this 作为父对象初始化 QLabelQVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(imageLabel);setLayout(layout);
}void ImageWindow::displayImage(const QPixmap &pixmap)
{imageLabel->setPixmap(pixmap);
}
三、实战+经验分享
这里我的项目的情况是:
- 主窗口的cpp文件
new_QT_python.cpp:中主要运行项目主体代码,其中开设子线程(视频检测线程,会把事实的检测结果以图片的形式传回主线程) - 需求:当按下开始检测的按钮后,立即弹出新窗口,将主线程(主窗口)中接受到检测线程传过来的结果图片在新窗口中进行显示。
Tips:为了突出多窗口的实现,省略了与此无关的代码
new_QT_python.h:
#include <QtWidgets/QMainWindow>
#include "ui_new_QT_python.h"
#include <opencv2/opencv.hpp>
#include "DetectionWindow.h"
//#include "inference.h"#pragma execution_character_set("utf-8")
#ifdef Q_OS_WIN
#pragma execution_character_set("utf-8") //解决 VS编译器下中文乱码
#endifclass new_QT_python : public QMainWindow
{Q_OBJECTpublic:new_QT_python(QWidget *parent = nullptr);~new_QT_python();
private:Ui::new_QT_pythonClass ui;VideoDetectionWorker m_detectionWorker1;QThread m_detectionThread1;DetectionWindow *imageWindow;private slots:void onDetectionResult1(const QImage& img);};
new_QT_python.cpp:
#include "new_QT_python.h"
#include <QTimer.h>
#include <QFileDialog>
#include <iostream>
#include <iomanip>
#include <filesystem>
#include <fstream>
#include <random>
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
#include "DetectionWindow.h"#pragma execution_character_set("utf-8")
#ifdef Q_OS_WIN
#pragma execution_character_set("utf-8") //解决 VS编译器下中文乱码
#endif#define ORT_API_MANUAL_INITnew_QT_python::new_QT_python(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);// 连接子线程的检测结果信号connect(&m_detectionWorker1, &VideoDetectionWorker::detectionResult, this, &new_QT_python::onDetectionResult1);imageWindow = new DetectionWindow; // Create the image window but don't show it yet// 将自定义线程对象移动到子线程中m_detectionWorker1.moveToThread(&m_detectionThread1);
}new_QT_python::~new_QT_python()
{m_detectionThread1.quit();m_detectionThread1.wait();
}void new_QT_python::onStartDetectionClicked()
{//显示检测过程的窗口imageWindow->show();// 启动子线程m_detectionThread1.start();// 检查子线程是否成功启动if (m_detectionThread1.isRunning()){// 子线程已成功启动// 在这里添加你的逻辑ui.status->setText(" m_detectionThread1 OK");}// 保存视频路径到子线程对象的成员变量m_detectionWorker1.m_videoPath = videoPath1;// 向子线程发送开始检测的信号QMetaObject::invokeMethod(&m_detectionWorker1, "startDetection", Qt::QueuedConnection);// 禁用按钮ui.startToDetect->setEnabled(false);
}void new_QT_python::onDetectionResult1(const QImage& img)
{imageWindow->displayImage(img);
}
DetectionWindow.h
#pragma once#include <QMainWindow>
#include "ui_DetectionWindow.h"class DetectionWindow : public QMainWindow
{Q_OBJECTpublic:DetectionWindow(QWidget *parent = nullptr);void displayImage(const QImage& img);~DetectionWindow();private:Ui::DetectionWindowClass ui;
};
DetectionWindow.cpp
#include "DetectionWindow.h"
#include <QVBoxLayout>DetectionWindow::DetectionWindow(QWidget *parent): QMainWindow(parent)
{ ui.setupUi(this);
}
void DetectionWindow::displayImage(const QImage& img)
{//使图片能和label尺寸相适应ui.imageLabel->setPixmap(QPixmap::fromImage(img).scaled(ui.imageLabel->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));ui.imageLabel->setAlignment(Qt::AlignCenter);
}
DetectionWindow::~DetectionWindow()
{}
四、结果展示
点击“开始检测”按钮,触发void new_QT_python::onStartDetectionClicked()函数,检测子线程启动,像主线程发送图片结果信号,onDetectionResult1函数负责让子窗口对象将图片在其窗口内展示。

相关文章:
QT C++实现点击按键弹出窗口并显示图片/视频|多窗口应用程序的设计和开发
一、介绍 首先,QT界面开发中主要大体分为2种多窗口的形式: 嵌入式: 新生成的窗口嵌入在主窗口内部独立窗口: 以弹窗形式的新窗口生成和展示 这里就讲解最简单的:点击案件后,跳出一个新窗口 二、代码实…...
shell和go实现:防火墙放行所有端口,唯独拦截80端口
shell 1.防火墙放行所有端口,唯独拦截80端口 1.1拦截 mkdir -p /data/shellscat > /data/shells/02nginx_close.sh <<-EOF #!/bin/bash# 检查Linux系统版本 linux_version$(cat /etc/redhat-release)# 根据Linux系统版本选择相应的防火墙开启命令和保存…...
QT信号槽实现分析
1.宏定义 qt中引入了MOC来反射,编译阶段变成 MOC–>预处理–>编译–>汇编–>链接 1-1、Q_OBJECT 这个宏定义了一系列代码,包括元对象和处理的函数 #define Q_OBJECT \public: \QT_WARNING_PUSH \Q_OBJECT_NO_OVERRIDE_WARNING \static c…...
【pytorch】tensor.detach()和tensor.data的区别
文章目录 序言相同点不同点测试实例应用 序言 .detach()和.data都可以用来分离tensor数据,下面进行比较pytorch0.4及之后的版本,.data仍保留,但建议使用.detach() 相同点 x.detach()和x.data返回和x相同数据的tensor,这个新的t…...
教师资格证相关
文章目录: 一:考试时间 二:考试科目 三:相关网站 四:相关 一:考试时间 教资 笔试 面试笔试报名笔试考试笔试公布面试报名面试时间面试公布上半年1月14日3月12日4月15日4月…...
卷积神经网络介绍
卷积神经网络(Convolutional Neural Networks,CNN) 网络的组件:卷积层,池化层,激活层和全连接层。 CNN主要由以下层构造而成: 卷积层:Convolutional layer(CONV)池化层:…...
XSS简介
XSS被称为跨站脚本攻击(Cross-site scripting),由于和CSS(CascadingStyle Sheets)重名,所以改为XSS。 XSS主要速于javascript语言完成恶意的攻击行为,因为javascript可非常灵活的操作html、css和浏览器 XSS就是指通过利用网页开发时留下的漏…...
手写redux和applyMiddleware中间件react示例
目录 一 核心代码 1.reducer 2.store.js 二 关于context API的使用 1. MyContext 2. createContext 3. ContextProvider 4. connect 三 组件验证效果 1. Todo 2. TodoList 3.TodoItem 4.TodoInput 5. App组件引入Todo组件 一 核心代码 1.reducer // 新增列表数…...
MATLAB R2024a 主要更新内容
系列文章目录 前言 一、主要更新 计算机视觉工具箱 —— 为二维和三维视觉任务设计算法、标注数据并生成代码。深度学习工具箱 —— 支持变换器等架构;导入并共同模拟 PyTorch 和 TensorFlow 模型。仪器控制工具箱 —— 使用仪器资源管理器应用程序管理带有 IVI 和…...
4.1.CVAT——目标检测的标注详细步骤
文章目录 1. 进入任务1. 创建任务2. 已创建的task3. 进入标注界面 2. 选择标注类型2.1 选择标注类型2.2 进行标注2.3 遮挡 2.快捷键3.导出标注结果 1. 进入任务 登录后会看到如下图界面,CVAT的标注最小单位是Task,每个Task为一个标注任务。点击Task按钮…...
图论-算法题
797. 所有可能的路径 题目: 给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序) graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i …...
onnx 1.16 doc学习笔记七:python API一览
onnx作为一个通用格式,很少有中文教程,因此开一篇文章对onnx 1.16文档进行翻译与进一步解释, onnx 1.16官方文档:https://onnx.ai/onnx/intro/index.html](https://onnx.ai/onnx/intro/index.html), 如果觉得有收获&am…...
LACP——链路聚合控制协议
LACP——链路聚合控制协议 什么是LACP? LACP(Link Aggregation Control Protocol,链路聚合控制协议)是一种基于IEEE802.3ad标准的实现链路动态聚合与解聚合的协议,它是链路聚合中常用的一种协议。 链路聚合组中启用了…...
终端启动jupyter notebook更换端口
一、问题描述 如果尝试在端口 8889 上启动 Jupyter Notebook 但最终启动在了 8890 端口,这通常意味着 8889 端口已经被占用。要解决这个问题,可以尝试以下几种方法来关闭占用 8889 端口的进程。 1. 查找并终止占用端口的进程 首先,需要找出…...
IT发布管理,轻松部署软件
我们带来了一项令人振奋的好消息,可有效缓解构建的质量相对劣质和发布的速度相对缓慢。 ManageEngine卓豪推出了ServiceDesk Plus MSP中的IT发布管理,配备了可视化的工作流程,这是PSA-ITSM解决方案的一部分。有了这个新功能,您可以…...
2024国际生物发酵展览会独家解读-力诺天晟科技
参展企业介绍 北京力诺天晟科技有限公司,专业致力于智能仪器仪表制造,工业自动控制系统用传感器、变送器的研发、设计、销售和服务。 公司坐落于首都北京行政副中心-通州区,下设生产子公司位于河北香河经济开发区,厂房面积 300…...
YOLOv9尝鲜测试五分钟极简配置
pip安装python包: pip install yolov9pip在https://github.com/WongKinYiu/yolov9/tree/main中下载好权重文件yolov9-c.pt。 运行下面代码: import yolov9model yolov9.load("yolov9-c.pt", device"cpu") # load pretrained or c…...
消息中间件篇之Kafka-消息不丢失
一、 正常工作流程 生产者发送消息到kafka集群,然后由集群发送到消费者。 但是可能中途会出现消息的丢失。下面是解决方案。 二、 生产者发送消息到Brocker丢失 1. 设置异步发送 //同步发送RecordMetadata recordMetadata kafkaProducer.send(record).get();//异…...
Rust使用calamine读取excel文件,Rust使用rust_xlsxwriter写入excel文件
Rust使用calamine读取已存在的test.xlsx文件全部数据,还读取指定单元格数据;Rust使用rust_xlsxwriter创建新的output.xlsx文件,并写入数据到指定单元格,然后再保存工作簿。 Cargo.toml main.rs /*rust读取excel文件*/ use cala…...
中文文本分类(pytorch 实现)
import torch import torch.nn as nn import torchvision from torchvision import transforms, datasets import os, PIL, pathlib, warningswarnings.filterwarnings("ignore") # 忽略警告信息# win10系统 device torch.device("cuda" if torch.cuda.i…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
