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.短信验证码生命期限内可暴力…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
