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

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函数里面添加&#xff1a; #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 模块&#xff0c;这个模块本身并没有rtsp的读写&#xff0c;那么读写rtsp是可以使用很多方法的&#xff0c;我们为了输出到pytorch直接使用AI程序&#xff0c;简化rtsp 输入&#xff0c;可以直接使用ffmpeg的子进程 方法一 …...

搭载KaihongOS的工业平板、机器人、无人机等产品通过3.2版本兼容性测评,持续繁荣OpenHarmony生态

近日&#xff0c;搭载深圳开鸿数字产业发展有限公司&#xff08;简称“深开鸿”&#xff09;KaihongOS软件发行版的工业平板、机器人、无人机等商用产品均通过OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;3.2 Release版本兼容性测评&#xff0c;获颁O…...

AIGC音视频工具分析和未来创新机会思考

编者按&#xff1a;相较于前两年&#xff0c;2023年音视频行业的使用量增长缓慢&#xff0c;整个音视频行业遇到瓶颈。音视频的行业从业者面临着相互竞争、不得不“卷”的状态。我们需要进行怎样的创新&#xff0c;才能从这种“卷”的状态中脱离出来&#xff1f;LiveVideoStack…...

Mybatis——返回值(resultType&resultMap)详解

之前的文章里面有对resultType和resultMap的简单介绍这一期出点详细的 resultType&#xff1a; 1&#xff0c;返回值为简单类型。 直接使用resultType“类型”&#xff0c;如string&#xff0c;Integer等。 String getEmpNameById(Integer id); <!-- 指定 result…...

多IP服务器有什么作用

1.利于搜索引擎收录&#xff1a; 使用多IP应用云服务器可使一个IP对应一个网站&#xff0c;使各个网站之间的独立性更强&#xff0c;这样搜索引擎会评定该网站质量更高&#xff0c; 更容易抓取到该网站的页面&#xff0c;便于搜索引擎收录。 2.提高网站的权重和排名&#xff…...

Python-主线程控制子线程结束

需求&#xff1a;主线程创建子线程和键盘输入监听线程&#xff0c;然后等待它们退出。当用户输入 q 后&#xff0c; 子线程会收到停止信号并退出&#xff0c;键盘输入监听线程也会退出&#xff0c;最终主线程退出。 import threading import time import keyboardclass Worker…...

水电站防雷工程综合解决方案

水电站防雷工程是指为了保护水电站的建筑物、设备和人员免受雷电危害而采取的一系列技术措施。水电站防雷工程的主要内容包括接地装置、引下线、接闪器、等电位连接、屏蔽、综合布线和电涌保护器等分项工程。水电站防雷工程的施工和质量验收应遵循国家标准《建筑物防雷工程施工…...

每日刷题(翻转+二分+BFS)

食用指南&#xff1a;本文为作者刷题中认为有必要记录的题目 ♈️今日夜电波&#xff1a;凄美地—郭顶 1:10 ━━━━━━️&#x1f49f;──────── 4:10 &#x1f504; ◀️ ⏸ ▶️ ☰…...

系统卡死问题分析

CPU模式 CPU Frequency Scaling (CPUFREQ) Introduction CPU频率调节设备驱动程序的功能。该驱动程序允许在运行过程中更改CPU的时钟频率。一旦CPU频率被更改,必要的电源供应电压也会根据设备树脚本(DTS)中定义的电压值进行变化。通过降低时钟速度,这种方法可以减少功耗…...

中大许少辉博士中国建筑出版传媒八一新书《乡村振兴战略下传统村落文化旅游设计》百度百科新闻

中大许少辉博士中国建筑出版传媒八一新书《乡村振兴战略下传统村落文化旅游设计》百度百科新闻&#xff1a; 乡村振兴战略下传统村落文化旅游设计 - 百度百科 https://baike.baidu.com/item/乡村振兴战略下传统村落文化旅游设计/62588677 概览 《乡村振兴战略下传统村落文化旅游…...

int和Integer的不同

一个奇怪的事情&#xff0c;在int[]用 Arrays.asList 转List 的时候&#xff0c;转过去的是List<int[]>。而不是List<int>类型的。于是试了String和Integer类型。发现只有Int[]有问题。 package com.test.lc;import java.util.ArrayList; import java.util.Arrays…...

eslintignore无效解决办法

项目的根目录下新建.eslintignore&#xff0c;但是无论怎么配置&#xff0c;该文件总是无法生效。本想解决不生效的问题&#xff0c;但是一直无法解决&#xff0c;于是换了一种解决问题的思路。 方法一&#xff1a; 在需要进行忽略的文件顶部加上 /* eslint-disable */这样e…...

C# 学习笔记

此笔记极水~ &#xff0c;来自两年前的库存。 是来自 B站 刘铁猛大佬 的视频&#xff0c;因为 好奇学了学。 其他 c# 变量的 内联赋值 vs. 构造函数内赋值 (引用自&#xff1a;https://www.iteye.com/blog/roomfourteen224-2208838) 上下文&#xff1a;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…...

深入理解分布式架构,构建高效可靠系统的关键

深入探讨分布式架构的核心概念、优势、挑战以及构建过程中的关键考虑因素。 引言什么是分布式架构&#xff1f;分布式架构的重要性 分布式系统的核心概念节点和通信数据分区与复制一致性与一致性模型负载均衡与容错性 常见的分布式架构模式客户端-服务器架构微服务架构事件驱动…...

为什么选择elasticsearch分布式搜索引擎

文章目录 &#x1f52d;什么是elasticsearch&#x1f320;ELK技术栈&#x1f320;elasticsearch和lucene&#x1f320;为什么不是其他搜索技术&#xff1f; &#x1f52d;总结 &#x1f52d;什么是elasticsearch elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常…...

一百五十九、Kettle——Kettle9.2通过配置Hadoop clusters连接Hadoop3.1.3(踩坑亲测、附流程截图)

一、目的 由于kettle的任务需要用到Hadoop&#xff08;HDFS&#xff09;&#xff0c;所以就要连接Hadoop服务。 之前使用的是kettle9.3&#xff0c;由于在kettle新官网以及博客百度等渠道实在找不到shims的驱动包&#xff0c;无奈换成了kettle9.2&#xff0c;kettle9.2的安装…...

渗透测试之逻辑漏洞

文章目录 一、支付漏洞1.修改附属值2.多重替换支付3.重复支付4.最小额支付5.最大值支付6.越权支付7.无限制试用8.多线程并发9.支付漏洞思路 二、密码找回漏洞1.本地验证绕过2.利用session重新绑定客户3.去掉验证参数绕过4.总结 三、短信验证码绕过1.短信验证码生命期限内可暴力…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...