UBuntu18.04 Qt之双HDMI屏切换
UBuntu18.04 Qt之双HDMI接2个4K屏并分别设置分辨率、主屏、副屏
一、设置HDMI-2为主屏
在main函数里面添加:
#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);{long nTotal = 0;char cData[2048] = {0};FILE *fstream = popen("xrandr | grep 'HDMI-2 connected'", "r");if(fstream){while(fgets(cData, sizeof(cData), fstream)){nTotal++;}pclose(fstream);}if(nTotal > 0){system("xrandr --output HDMI-2 --primary --left-of HDMI-1 --auto");}}MainWindow w;w.show();return a.exec();
}
二、代码切换程序在主屏或副屏显示
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class MainWindow : public QWidget
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void StartTimer();void OnClickBtn1();void OnClickBtn2();void OnClickBtn3();void OnClickBtn4();void OnClickBtn5();private:void SetPos(int nScreen);private:void timerEvent(QTimerEvent*);private:int m_nTimerID;private:int m_nScreebResolutions;int m_nScreenID;
};#endif // MAINWINDOW_H
MainWIndow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel>
#include <QScreen>
#include <QPushButton>
#include <QHBoxLayout>
#include <QDesktopWidget>void OutPut(const char* cData)
{FILE* pFile = fopen("/opt/NVMS/111.log", "ab+");if(pFile){fwrite(cData, 1, strlen(cData), pFile);fclose(pFile);}
}MainWindow::MainWindow(QWidget *parent) :QWidget(parent)
{QLabel* p = new QLabel("123", this);QPushButton* qBtn1 = new QPushButton("0_1920", this);qBtn1->setFixedSize(100, 50);connect(qBtn1, &QPushButton::clicked, this, &MainWindow::OnClickBtn1);QPushButton* pBtn2 = new QPushButton("0_3840", this);pBtn2->setFixedSize(100, 50);connect(pBtn2, &QPushButton::clicked, this, &MainWindow::OnClickBtn2);QPushButton* qBtn3 = new QPushButton("1_1920", this);qBtn3->setFixedSize(100, 50);connect(qBtn3, &QPushButton::clicked, this, &MainWindow::OnClickBtn3);QPushButton* pBtn4 = new QPushButton("1_3840", this);pBtn4->setFixedSize(100, 50);connect(pBtn4, &QPushButton::clicked, this, &MainWindow::OnClickBtn4);QPushButton* pBtn5 = new QPushButton("Query", this);pBtn5->setFixedSize(100, 50);connect(pBtn5, &QPushButton::clicked, this, &MainWindow::OnClickBtn5);QHBoxLayout* pLayout = new QHBoxLayout(this);pLayout->addWidget(p, 0, Qt::AlignLeft | Qt::AlignTop);pLayout->addWidget(qBtn1, 0, Qt::AlignLeft | Qt::AlignTop);pLayout->addWidget(pBtn2, 0, Qt::AlignLeft | Qt::AlignTop);pLayout->addWidget(qBtn3, 0, Qt::AlignLeft | Qt::AlignTop);pLayout->addWidget(pBtn4, 0, Qt::AlignLeft | Qt::AlignTop);pLayout->addWidget(pBtn5, 0, Qt::AlignLeft | Qt::AlignTop);//m_nScreenID = 0;m_nScreebResolutions = 0;SetPos(m_nScreenID);
}MainWindow::~MainWindow()
{}void MainWindow::StartTimer()
{}void MainWindow::timerEvent(QTimerEvent*)
{SetPos(m_nScreenID);if(m_nScreenID == 1){OnClickBtn5();}
}void MainWindow::SetPos(int nScreen)
{char cData[2048] = {0};QDesktopWidget* desktopWidget = QApplication::desktop();QRect rect = desktopWidget->availableGeometry(nScreen);QRect rect1 = desktopWidget->screenGeometry(nScreen);/*if(m_nScreenID == 0){*/setGeometry(rect);sprintf(cData, "AAA:%d %d %d %d %d\n", nScreen, rect.left(), rect.top(), rect.width(), rect.height());/*}else{setGeometry(QRect(rect1.left(), rect1.top(), rect1.width(), rect1.height()));sprintf(cData, "AAA:%d %d %d %d %d\n", nScreen, rect1.left(), rect1.top(), rect1.width(), rect1.height());}*/OutPut(cData);/*{int nScreenNum = qApp->desktop()->screenCount();for(int i = 0; i < nScreenNum; i++){QScreen* qScreen = qApp->screens().at(i);memset(cData, 0, 2048);sprintf(cData, "BBB:%d %d %d %d %d %d\n", nScreenNum, nScreen, qScreen->geometry().left(), qScreen->geometry().top(), qScreen->geometry().width(), qScreen->geometry().height());OutPut(cData);}memset(cData, 0, 2048);sprintf(cData, "CCC:%d %d %d %d %d %d\n", nScreenNum, nScreen, rect1.left(), rect1.top(), rect1.width(), rect1.height());OutPut(cData);}*/
}void MainWindow::OnClickBtn1()
{char cData[2048] = {0};FILE *fstream = popen("xrandr --output HDMI-2 --mode 1920x1080 --left-of HDMI-1", "r");//xrandr -s 1920x1080 --screen 0if(fstream){while(fgets(cData, sizeof(cData), fstream)){OutPut(cData);}pclose(fstream);}m_nScreenID = 0;m_nScreebResolutions = 0;m_nTimerID = startTimer(1000);
}void MainWindow::OnClickBtn2()
{char cData[2048] = {0};FILE *fstream = popen("xrandr --output HDMI-2 --mode 3840x2160 --left-of HDMI-1", "r");//xrandr -s 3840x2160 --screen 0if(fstream){while(fgets(cData, sizeof(cData), fstream)){OutPut(cData);}pclose(fstream);}m_nScreenID = 0;m_nScreebResolutions = 1;m_nTimerID = startTimer(1000);
}
void MainWindow::OnClickBtn3()
{char cData[2048] = {0};FILE *fstream = popen("xrandr --output HDMI-1 --mode 1920x1080 --right-of HDMI-2 ", "r");if(fstream){while(fgets(cData, sizeof(cData), fstream)){OutPut(cData);}pclose(fstream);}m_nScreenID = 1;m_nScreebResolutions = 0;m_nTimerID = startTimer(1000);
}void MainWindow::OnClickBtn4()
{char cData[2048] = {0};FILE *fstream = popen("xrandr --output HDMI-1 --mode 3840x2160 --right-of HDMI-2 ", "r");if(fstream){while(fgets(cData, sizeof(cData), fstream)){OutPut(cData);}pclose(fstream);}m_nScreenID = 1;m_nScreebResolutions = 1;m_nTimerID = startTimer(1000);
}void MainWindow::OnClickBtn5()
{char cData[2048] = {0};FILE *fstream = popen("xrandr ", "r");if(fstream){while(fgets(cData, sizeof(cData), fstream)){OutPut(cData);}pclose(fstream);}
}
左边的4k显示器和右边的4k显示器分别显示程序的主界面
相关文章:
UBuntu18.04 Qt之双HDMI屏切换
UBuntu18.04 Qt之双HDMI接2个4K屏并分别设置分辨率、主屏、副屏 一、设置HDMI-2为主屏 在main函数里面添加: #include "mainwindow.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);{long nTotal 0;c…...
c#配置提供者
在 C# 中,配置系统是一种用于管理应用程序配置数据的机制。通常情况下,应用程序的配置数据包括连接字符串、应用程序设置、环境变量等。C# 配置系统允许您轻松地读取和使用这些配置数据,而不需要硬编码在代码中。 除了默认的配置提供者外,C# 配置系统还支持其他配置提供者…...
python rtsp 硬件解码 二
上次使用了python的opencv模块 述说了使用PyNvCodec 模块,这个模块本身并没有rtsp的读写,那么读写rtsp是可以使用很多方法的,我们为了输出到pytorch直接使用AI程序,简化rtsp 输入,可以直接使用ffmpeg的子进程 方法一 …...
搭载KaihongOS的工业平板、机器人、无人机等产品通过3.2版本兼容性测评,持续繁荣OpenHarmony生态
近日,搭载深圳开鸿数字产业发展有限公司(简称“深开鸿”)KaihongOS软件发行版的工业平板、机器人、无人机等商用产品均通过OpenAtom OpenHarmony(以下简称“OpenHarmony”)3.2 Release版本兼容性测评,获颁O…...
AIGC音视频工具分析和未来创新机会思考
编者按:相较于前两年,2023年音视频行业的使用量增长缓慢,整个音视频行业遇到瓶颈。音视频的行业从业者面临着相互竞争、不得不“卷”的状态。我们需要进行怎样的创新,才能从这种“卷”的状态中脱离出来?LiveVideoStack…...
Mybatis——返回值(resultType&resultMap)详解
之前的文章里面有对resultType和resultMap的简单介绍这一期出点详细的 resultType: 1,返回值为简单类型。 直接使用resultType“类型”,如string,Integer等。 String getEmpNameById(Integer id); <!-- 指定 result…...
多IP服务器有什么作用
1.利于搜索引擎收录: 使用多IP应用云服务器可使一个IP对应一个网站,使各个网站之间的独立性更强,这样搜索引擎会评定该网站质量更高, 更容易抓取到该网站的页面,便于搜索引擎收录。 2.提高网站的权重和排名ÿ…...
Python-主线程控制子线程结束
需求:主线程创建子线程和键盘输入监听线程,然后等待它们退出。当用户输入 q 后, 子线程会收到停止信号并退出,键盘输入监听线程也会退出,最终主线程退出。 import threading import time import keyboardclass Worker…...
水电站防雷工程综合解决方案
水电站防雷工程是指为了保护水电站的建筑物、设备和人员免受雷电危害而采取的一系列技术措施。水电站防雷工程的主要内容包括接地装置、引下线、接闪器、等电位连接、屏蔽、综合布线和电涌保护器等分项工程。水电站防雷工程的施工和质量验收应遵循国家标准《建筑物防雷工程施工…...
每日刷题(翻转+二分+BFS)
食用指南:本文为作者刷题中认为有必要记录的题目 ♈️今日夜电波:凄美地—郭顶 1:10 ━━━━━━️💟──────── 4:10 🔄 ◀️ ⏸ ▶️ ☰…...
系统卡死问题分析
CPU模式 CPU Frequency Scaling (CPUFREQ) Introduction CPU频率调节设备驱动程序的功能。该驱动程序允许在运行过程中更改CPU的时钟频率。一旦CPU频率被更改,必要的电源供应电压也会根据设备树脚本(DTS)中定义的电压值进行变化。通过降低时钟速度,这种方法可以减少功耗…...
中大许少辉博士中国建筑出版传媒八一新书《乡村振兴战略下传统村落文化旅游设计》百度百科新闻
中大许少辉博士中国建筑出版传媒八一新书《乡村振兴战略下传统村落文化旅游设计》百度百科新闻: 乡村振兴战略下传统村落文化旅游设计 - 百度百科 https://baike.baidu.com/item/乡村振兴战略下传统村落文化旅游设计/62588677 概览 《乡村振兴战略下传统村落文化旅游…...
int和Integer的不同
一个奇怪的事情,在int[]用 Arrays.asList 转List 的时候,转过去的是List<int[]>。而不是List<int>类型的。于是试了String和Integer类型。发现只有Int[]有问题。 package com.test.lc;import java.util.ArrayList; import java.util.Arrays…...
eslintignore无效解决办法
项目的根目录下新建.eslintignore,但是无论怎么配置,该文件总是无法生效。本想解决不生效的问题,但是一直无法解决,于是换了一种解决问题的思路。 方法一: 在需要进行忽略的文件顶部加上 /* eslint-disable */这样e…...
C# 学习笔记
此笔记极水~ ,来自两年前的库存。 是来自 B站 刘铁猛大佬 的视频,因为 好奇学了学。 其他 c# 变量的 内联赋值 vs. 构造函数内赋值 (引用自:https://www.iteye.com/blog/roomfourteen224-2208838) 上下文:c#中变量的内联赋值其…...
算法练习(8):牛客在线编程08 字符串
package jz.bm;import java.util.Arrays;public class bm8 {/*** BM83 字符串变形*/public String trans(String s, int n) {StringBuilder res new StringBuilder();//大小写转换for (int i 0; i < n; i) {if (s.charAt(i) > a && s.charAt(i) < z) {res.a…...
深入理解分布式架构,构建高效可靠系统的关键
深入探讨分布式架构的核心概念、优势、挑战以及构建过程中的关键考虑因素。 引言什么是分布式架构?分布式架构的重要性 分布式系统的核心概念节点和通信数据分区与复制一致性与一致性模型负载均衡与容错性 常见的分布式架构模式客户端-服务器架构微服务架构事件驱动…...
为什么选择elasticsearch分布式搜索引擎
文章目录 🔭什么是elasticsearch🌠ELK技术栈🌠elasticsearch和lucene🌠为什么不是其他搜索技术? 🔭总结 🔭什么是elasticsearch elasticsearch是一款非常强大的开源搜索引擎,具备非常…...
一百五十九、Kettle——Kettle9.2通过配置Hadoop clusters连接Hadoop3.1.3(踩坑亲测、附流程截图)
一、目的 由于kettle的任务需要用到Hadoop(HDFS),所以就要连接Hadoop服务。 之前使用的是kettle9.3,由于在kettle新官网以及博客百度等渠道实在找不到shims的驱动包,无奈换成了kettle9.2,kettle9.2的安装…...
渗透测试之逻辑漏洞
文章目录 一、支付漏洞1.修改附属值2.多重替换支付3.重复支付4.最小额支付5.最大值支付6.越权支付7.无限制试用8.多线程并发9.支付漏洞思路 二、密码找回漏洞1.本地验证绕过2.利用session重新绑定客户3.去掉验证参数绕过4.总结 三、短信验证码绕过1.短信验证码生命期限内可暴力…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
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…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
