QT C++实现点击按键弹出窗口并显示图片/视频|多窗口应用程序的设计和开发

news2025/1/25 4:35:40

一、介绍

首先,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_OBJECT

public:
    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_OBJECT

public:
    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 作为父对象初始化 QLabel
    QVBoxLayout *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编译器下中文乱码
#endif

class new_QT_python : public QMainWindow
{
    Q_OBJECT

public:
    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_INIT

new_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_OBJECT

public:
	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函数负责让子窗口对象将图片在其窗口内展示。
在这里插入图片描述

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

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

相关文章

IntelliJ IDEA 2023:创新不止步,开发更自由 mac/win版

IntelliJ IDEA 2023激活版是一款强大而智能的集成开发环境(IDE)&#xff0c;为开发者提供了一系列先进的功能和工具&#xff0c;帮助他们更高效地编写、调试和测试代码。 IntelliJ IDEA 2023 软件获取 IntelliJ IDEA 2023继承了其前代版本的优秀基因&#xff0c;并在此基础上进…

raft选举算法和zookeeper选举算法的优略

RAFT&#xff08;Replicated State Machine&#xff09;选举算法和ZooKeeper选举算法都是分布式系统中常用的选举算法&#xff0c;用于确定系统中的主节点或领导者。它们有各自的优劣势&#xff0c;下面是对它们进行的简要比较&#xff1a; RAFT选举算法&#xff1a; 优势&a…

【Hudi】调优指南

1 并行度 2 Off-heap (堆外)内存 3 Spark内存 4 调整文件大小 5 时间序列/日志数据 6 GC调优 7 OutOfMemory

机器学习:朴素贝叶斯算法(Python)

一、朴素贝叶斯算法的实现 naive_bayes_classifier.py import numpy as np import collections as cc # 集合的计数功能 from scipy.stats import norm # 极大似然估计样本的均值和标准方差 from data_bin_wrapper import DataBinsWrapperclass NaiveBayesClassifier:"…

leetcode:134.加油站

解题思路&#xff1a;需要注意开始时的编号&#xff0c;有的可以走一圈&#xff0c;有的走不了 模拟过程&#xff1a;for循环主要是用来模拟线性的过程&#xff0c;而在这里它是环状的&#xff1b; 可以用暴力解法&#xff0c;但是在这里我用贪心来解决。 常见疑惑&#xff1…

一文详细拆解Agent工作原理

一、写在前面 Agent&#xff0c;中文译为“代理”或“智能体”&#xff0c;是一种能够在特定环境中自主行动、感知环境、做出决策并与其他Agent或人类进行交互的计算机程序或实体。它们具备自主性、反应性、社交性和适应性等特点&#xff0c;能够根据环境的变化调整自己的行为…

vue3项目中动态加载字体,并解决字体图标显示异常问题

先上效果图 setIconfont.ts文件代码 // 字体图标 url // 为什么引入俩个版本的font-awesome图标&#xff0c;因为最新版本的图标需要匹配字体库&#xff0c;单独引入样式文件部分图标会不显示 // 测试发现在引入4.7.0中的样式后所有的图标都可以显示&#xff0c;暂且认为4.7…

蓝桥杯备战刷题one(自用)

1.被污染的支票 #include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() {int n;cin>>n;vector<int>L;map<int,int>mp;bool ok0;int num;for(int i1;i<n;i){cin>>nu…

Rust-windows安装环境

文章目录 前言一、Using rustup (Recommended)二、配置vscode解决办法&#xff1a;在终端依次运行如下两条指令&#xff1a; 总结 前言 Rust学习系列&#xff0c;之前介绍了macOS环境下的rust安装方式macOS rust安装。这篇学习windows的rust安装方式。 提示&#xff1a;以下是…

汇总版!美团搜索推荐算法面试题10道(含答案)

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂同学、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天我整…

跟着cherno手搓游戏引擎【25】封装2DRenderer,封装shader传参,自定义Texture

封装2DRenderer&#xff1a; Renderer.h: #include"ytpch.h" #include"Renderer.h" #include <Platform/OpenGL/OpenGLShader.h> #include"Renderer2D.h" namespace YOTO {Renderer::SceneData* Renderer::m_SceneData new Renderer::S…

JavaWeb——005 -- 请求响应 分层解耦(Postman、三层架构、IOC、DI、注解)

目录 一、请求 1、Postman&#xff08;接口测试工具&#xff09; 1.1、介绍 ②、安装 2、简单参数 1.1、原始方式 1.2、SpringBoot方法 ③、小结 3、实体参数 3.1、简单实体对象 3.2、复杂实体对象 3.3、小结 4、数组集合参数 ①、数组​编辑 ②、集合 ③、小结…

15-55V输入自动升降压 光伏MPPT自动跟踪充电方案 大功率300瓦

1.MPPT原理--简介 MPPT&#xff0c;全称为Maximum Power Point Tracking&#xff0c;即最大功点跟踪&#xff0c;它是一种通过调节电气模块的工作状态&#xff0c;使光伏板能够输出更多电能的电气系统能够将太阳能电池板发出的直流电有效地贮存在蓄电池中&#xff0c;可有效地…

python + selenium/appnium

Selenium 的自动化原理: selenium 自动化流程: 自动化程序调用Selenium 客户端库函数&#xff08;比如点击按钮元素&#xff09;客户端库会发送Selenium 命令 给浏览器的驱动程序浏览器驱动程序接收到命令后 ,驱动浏览器去执行命令浏览器执行命令浏览器驱动程序获取命令执行的…

Linux 不同架构、不同系统的问题

文章目录 一、麒麟V10&#xff08;kylin&#xff09;操作系统中&#xff0c;sudo执行程序后&#xff0c;其环境变量依然为用户家目录。&#xff08;1&#xff09;背景&#xff08;2&#xff09;原因&#xff08;3&#xff09;解决办法 二、统信&#xff08;UOS&#xff09;操作…

标准库中的String类 String(C++)【1】

学习String的时候我是对照https://legacy.cplusplus.com/这个网站进行理解 标准库中的String类 string类的基础String的特点String常用的接口&#xff08;黑框标记的是常用接口&#xff09;构造函数string类对象的访问及遍历操作第一种 下标[ ]第二种 迭代器第三种 范围for st…

OpenAI的Sora深度解析

计算机视觉算法分享。问题或建议&#xff0c;请文章私信或者文章末尾扫码加微信留言。sora 具体介绍和使用方法&#xff1a;OpenAI Sora 下一代生产力&#xff1a;最新小白必看教程 | 解剖Sora的前世今生 | Sora核心源码目前 openai 官方还未开放 sora 灰度&#xff0c;不过根据…

客户端订阅服务端事件的机制

一、场景描述 产业大脑平台是一个典型的审核系统&#xff0c;用户发布到平台的信息需要经过审核员审核后生效。 用户发布信息->审核员审核信息->用户信息生效&#xff0c;这一流程可能发生在用户的同一次登录周期内。为了使客户端能实时响应信息的状态变化&#xff0c;…

QML小案例 使用QML简单实现翻牌版扫雷游戏(二)

使用QML实现扫雷功能案例&#xff0c;使用QML界面实现翻牌特效&#xff0c;以及随机的&#xff0c;从左到右&#xff0c;从中心向两边加载界面的特效实现&#xff0c;简单的示例NumberAnimation&#xff0c;PropertyAnimation&#xff0c;SequentialAnimation实现动画的效果,QM…

Python接口自动化之Token详解及应用

以下介绍Token原理及在自动化中的应用。 一、Token基本概念及原理 1.Token作用 为了验证用户登录情况以及减轻服务器的压力&#xff0c;减少频繁的查询数据库&#xff0c;使服务器更加健壮。 2.什么是Token Token是服务端生成的一串字符串&#xff0c;以作客户端进行请求的一…