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函數負責讓子窗口對象將圖片在其窗口內展示。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713864.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713864.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713864.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用FFMPEG 將RTSP流的音頻G711 轉碼為AAC 并 推流到RTMP

之前我們的視頻轉碼項目中 是沒有加入音頻的 現在 需要加入音頻 &#xff0c;由于RTMP只支持AAC的 音頻流 而有的RTSP流的音頻編碼并不是AAC 大多數都是G711編碼 還分為G711A 和G711U 之前用ffmpeg命令行可以直接 完成轉碼 并推送到RTMP 但是考慮到無法獲取更詳細的狀…

Qt篇——QTableWidget保存表格數據到Excel文件中,讀Excel內容到QTableWidget

表格和excel例子如下圖所示&#xff1a; 一、QTableWidget保存表格數據到Excel文件中 代碼如下&#xff1a; &#xff08;pro文件中添加QT axcontainer&#xff09; #include <QAxObject>void MainWindow::saveTableToExcel() {QDateTime current_date_time QDateTi…

六、MQTT源碼簡單瀏覽

1、MQTT程序分層 1.1、MQTT客戶端工作流程 (1)連接MQTT服務器。 (2)客戶端向服務器發送訂閱主題。 (3)客戶端等待MQTT的消息。 (4)客戶端向服務器發送消息。 2.2、MQTT程序結構 APP層 while循環或一個進程中&#xff1a;等待消息&#xff0c;處理消息&#xff1b; 發送消…

[法規規劃|方案實操]數據資產入表,城投將獲融資新渠道

2023年8月&#xff0c;財政部發布了《企業數據資源相關會計處理暫行規定》&#xff0c;并從2024年1月1日開始實施&#xff0c;標志著數據資產正式納入企業的資產負債表。這一舉措被視為數據資產從理論走向實踐的重大一步。 數據資產入表對城投運營模式的影響 隨著全球經濟格局…

Vue3速成

文章目錄 day 11. 創建vue3工程3. 響應式數據4. 計算屬性 day 25. watch 監視6. watchEffect7. 標簽的ref屬性8. 回顧TS中的接口_泛型_自定義類型 day 1 1. 創建vue3工程 相關代碼如下&#xff1a; ## 創建vue工程 npm create vuelastest## 安裝node_modules npm install //…

JSON 文件里的 “$schema” 是干什么用的?

最近我在做一些前端項目&#xff0c;我發現有的配置文件&#xff0c;比如 .prettierrc.json 或者 tsconfig.json 里面都會看到一個 $schema 字段&#xff0c;有點好奇&#xff0c;就查了一下。 什么是 JSON Schema JSON Schema是一種基于JSON (JavaScript Object Notation) 的…

【Leetcode】2369. 檢查數組是否存在有效劃分

文章目錄 題目思路代碼結果 題目 題目鏈接 給你一個下標從 0 開始的整數數組 nums &#xff0c;你必須將數組劃分為一個或多個 連續 子數組。 如果獲得的這些子數組中每個都能滿足下述條件 之一 &#xff0c;則可以稱其為數組的一種 有效 劃分&#xff1a; 子數組 恰 由 2 個…

MATLAB算法實戰應用案例精講-【圖像處理】三維重建(最終篇)

目錄 前言 相機定標和三維重建 針孔相機模型和變形 三維成像 一、機器視覺系統組成

大數據智能化-長視頻領域

隨著數字化時代的到來&#xff0c;長視頻領域的發展迎來了新的機遇和挑戰。在這一背景下&#xff0c;大數據智能化技術的應用成為長視頻行業提升用戶體驗、優化運營管理的重要手段之一。本文將從優愛騰3大長視頻背景需求出發&#xff0c;分析靜態資源CDN、視頻文件存儲與分發、…

網絡安全、信息安全、計算機安全,有何區別?

這三個概念都存在&#xff0c;一般人可能會混為一談。 究竟它們之間是什么關系&#xff1f;并列&#xff1f;交叉&#xff1f; 可能從廣義上來說它們都可以用來表示安全security這樣一個籠統的概念。 但如果從狹義上理解&#xff0c;它們應該是有區別的&#xff0c;區別在哪呢&…

力扣hot100題解(python版36-40題)

36、二叉樹的中序遍歷 給定一個二叉樹的根節點 root &#xff0c;返回 它的 *中序 遍歷* 。 示例 1&#xff1a; 輸入&#xff1a;root [1,null,2,3] 輸出&#xff1a;[1,3,2]示例 2&#xff1a; 輸入&#xff1a;root [] 輸出&#xff1a;[]示例 3&#xff1a; 輸入&am…

tcping實用小工具

Tcping實用小工具命令詳解 一、tcping介紹 tcping&#xff1a;tcping命令基于tcp協議監控&#xff0c;可以從較低級別的協議獲得簡單的&#xff0c;可能不可靠的數據報服務。 原則上&#xff0c;TCP應該能夠在從容硬線連接到分組交換或電路交換網絡的各種通信系統之上操作。 …

【機器學習基礎】層次聚類-BIRCH聚類

&#x1f680;個人主頁&#xff1a;為夢而生~ 關注我一起學習吧&#xff01; &#x1f4a1;專欄&#xff1a;機器學習 歡迎訂閱&#xff01;相對完整的機器學習基礎教學&#xff01; ?特別提醒&#xff1a;針對機器學習&#xff0c;特別開始專欄&#xff1a;機器學習python實戰…

企業微信私有部署:實現高效溝通與信息安全

隨著移動互聯網的快速發展&#xff0c;企業微信作為一種高效、便捷的通訊工具&#xff0c;已經成為了眾多企業的首選。然而&#xff0c;對于一些對信息安全有特殊要求的大型企業而言&#xff0c;使用公有版企業微信并不能滿足其安全需求。因此&#xff0c;企業微信私有部署應運…

matplotlib.animation 3d姿態動畫

目錄 演示效果&#xff1a; 演示代碼&#xff1a; 保存為gif 演示效果&#xff1a; 演示代碼&#xff1a; import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.animation import FuncAnimation# 定義人體關鍵點…

【c++入門】純粹的五位偶數

說明 純粹偶數指的是一個數的各個位都是偶數的數&#xff0c;比如&#xff1a;24686&#xff1b;請編程求出10000~n中&#xff0c;所有的五位的純粹偶數有多少個&#xff1f; 輸入數據 一個整數n&#xff08;n為一個5位的整數&#xff09; 輸出數據 一個整數&#xff0c;代…

網絡防御第6次作業

防病毒網關 按照傳播方式分類 病毒 病毒是一種基于硬件和操作系統的程序&#xff0c;具有感染和破壞能力&#xff0c;這與病毒程序的結構有關。病毒攻擊的宿主程序是病毒的棲身地&#xff0c;它是病毒傳播的目的地&#xff0c;又是下一次感染的出發點。計算機病毒感染的一般過…

Java基礎 - Stream 流:Stream API的中間操作

在上一篇博客中&#xff0c;我介紹了構建 Stream 流的多種方式&#xff0c;以及 Stream 流的特點和優勢。如果你還沒有閱讀&#xff0c;你可以點擊這里查看。 Java基礎 - Stream 流&#xff1a;構建流的多種方式 在這篇博客中&#xff0c;我將探索 Stream API 的中間操作&…

動態規劃(算法競賽、藍橋杯)--分組背包DP

1、B站視頻鏈接&#xff1a;E16 背包DP 分組背包_嗶哩嗶哩_bilibili #include <bits/stdc.h> using namespace std; const int N110; int v[N][N],w[N][N],s[N]; // v[i,j]:第i組第j個物品的體積 s[i]:第i組物品的個數 int f[N][N]; // f[i,j]:前i組物品&#xff0c;能放…

學習JavaEE的日子 Day21 枚舉

Day21 1.枚舉的引入 需求&#xff1a;編寫季節類&#xff08;Season&#xff09;&#xff0c;該類只有四個對象&#xff08;spring&#xff0c;summer&#xff0c;autumn&#xff0c;winter&#xff09; 概念&#xff1a;枚舉&#xff08;enum&#xff09;全稱為 enumeration&…