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显示器分别显示程序的主界面

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

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

相关文章

spring cloud gateway中配置uri

gateway中配置uri配置有三种方式: websocket方式&#xff1a;uri: ws://localhost:9000http方式: uri: http://localhost:8130/lb注册中心配置方式&#xff08;注册的服务名称&#xff09;: uri: lb://monitor-ms gateway的lb方式识别的服务名称命名规则&#xff1a; "[…

设计模式——适配器模式

引入实例 说起适配器其实在我们的生活中是非常常见的&#xff0c;比如&#xff1a;学校的宿舍的电压都比较低&#xff0c;而有的学生想使用大功率电器&#xff0c;宿舍的就会跳闸&#xff0c;然而如果你使用一个适配器&#xff08;变压器&#xff09;就可以使用了&#xff08;…

Jtti:windows虚拟内存最小值太低如何解决

当Windows虚拟内存的最小值设置过低时&#xff0c;可能会导致系统性能下降、应用程序崩溃甚至系统不稳定。解决方法包括&#xff1a; 调整虚拟内存设置&#xff1a; 可以通过以下步骤调整虚拟内存的设置&#xff1a; 右键点击“此电脑”或“计算机”&#xff0c;选择“属性”。…

被迫学习一波Linux命令

事情起因 部署一个服务&#xff0c;人家说了最低配置是3G&#xff0c;我没当回事&#xff0c;拿着个2G的服务器直接就上了&#xff0c;结果&#xff0c;哈哈&#xff0c;都能猜到结果&#xff1a;服务器内存爆了&#xff01;&#xff01;&#xff01;而且最可气的是服务器还登…

ansible案列之LNMP分布式剧本

LNMP分布式剧本 一&#xff1a;环境设置二&#xff1a;编写Nginx剧本准备nginx下载源准备配置文件并开放PHP的访问路径准备php测试页面编写nginx剧本 三&#xff1a;编写Mysql剧本编写密码获取脚本准备Mysql的yum源编写mysql剧本 四&#xff1a;准备PHP剧本准备两个配置文件编写…

深入理解linux内核--块设备驱动程序

块设备的处理 块设备驱动程序上的每个操作都涉及很多内核组件&#xff1b;其中最重要的一些如图14-1所示。 例如&#xff0c;我们假设一个进程在某个磁盘文件上发出一个read()系统调用 ——我们将会看到处理write请求本质上采用同样的方式。 下面是内核对进程请求给予回应的一…

煤矿调度IP语音对讲广播模块一键求助对讲矿用调度通信系统SIP语音对讲求助终端

硬件接口描述 SV-2101VP/ SV-2103VP系列网络音频模块&#xff0c;所有外部连接采用端子&#xff0c;电源采用2.0mm的端子&#xff0c;网络采用标准RJ45连接器&#xff0c;其他都是1.25mm的连接器。 端口类型定义 P ———— 电源 AI ———— 模拟输入&#xff08;在这里是音…

微信小程序前后端开发快速入门(完结篇)

这篇是微信小程序前后端快速入门完结篇了&#xff0c;今天利用之前学习过的所有知识做一个新的项目「群登记助手v1.0」小程序。 整体技术架构&#xff1a;小程序原生前端小程序云开发。 经历了前面教程的学习&#xff0c;大家有了一定的基础&#xff0c;所以本次分享重心主要是…

Ubuntu服务器service版本初始化

下载 下载路径 官网&#xff1a;https://cn.ubuntu.com/ 下载路径&#xff1a;https://cn.ubuntu.com/download 服务器&#xff1a;https://cn.ubuntu.com/download/server/step1 点击下载&#xff08;22.04.3&#xff09;&#xff1a;https://cn.ubuntu.com/download/server…

【Python百日进阶-Web开发-Peewee】Day271 - Peewee API文档 - 字段(二)

文章目录 11.3.17 class UUIDField11.3.18 class BinaryUUIDField11.3.19 class DateTimeField11.3.20 class DateField11.3.21 class TimeField11.3.22 class TimestampField11.3.23 class IPField11.3.24 class BooleanField11.3.25 class BareField11.3.26 class ForeignKey…

神经网络基础-神经网络补充概念-06-计算图

概念 “计算图”&#xff08;Computational Graph&#xff09;是一种用于表示数学表达式计算过程的图结构&#xff0c;广泛用于深度学习和自动微分等领域。计算图将复杂的数学表达式分解为一系列简单的计算节点&#xff0c;这些节点之间通过边连接&#xff0c;形成了一个有向无…

【jwt】JWT原理,JWT是用来解决什么问题的,如何自定义生成JWT数据,并且实现jwt数据的解码

JWT&#xff1a; JSON Web Token 1. jwt概述 用户登录成功后&#xff0c;服务端 如何知道客户端的每次请求对应的是哪个用户呢&#xff1f;怎么做&#xff1a;目前有两种方式实现. 1.1. 一是通过sessionId的方式&#xff0c;登录成功后服务端返回sessionId给客户端&#xff0…

【2023年11月第四版教材】《第5章-信息系统工程之数据工程(第三部分)》

《第5章-信息系统工程之数据工程&#xff08;第三部分&#xff09;》 2 数据工程2.1 数据建模2.2 数据标准化2.3 数据运维2.4 数据开发利用2.5 数据库安全 2 数据工程 2.1 数据建模 1、根据模型应用目的不同&#xff0c;可以将数据模型划分为三类:概念模型、逻辑模型和物理模…

【数据结构】栈与队列

1 栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出 LIFO (Last In First Out) 的原则。 压栈&#xff1a;栈…

力扣75——图广度优先搜索

总结leetcode75中的图广度优先搜索算法题解题思路。 上一篇&#xff1a;力扣75——图深度优先搜索 力扣75——图广度优先搜索 1 迷宫中离入口最近的出口2 腐烂的橘子1-2 解题总结 1 迷宫中离入口最近的出口 题目&#xff1a; 给你一个 m x n 的迷宫矩阵 maze &#xff08;下标…

Kafka中的 ISR 机制

ISR 是什么 ISR 的全称叫做&#xff1a; In-Sync Replicas &#xff08;同步副本集&#xff09;, 可以理解为和 leader 保持同步的所有副本的集合。ISR 动态维护了一个和 leader 副本保持同步副本集合&#xff0c;ISR 中的副本全部都和 leader 的数据保持同步。 设一个场景&a…

JupyterHub实战应用

一、JupyerHub jupyter notebook 是一个非常有用的工具&#xff0c;我们可以在浏览器中任意编辑调试我们的python代码&#xff0c;并且支持markdown 语法&#xff0c;可以说是科研利器。但是这种情况适合个人使用&#xff0c;也就是jupyter notebook以我们自己的主机作为服务器…

PostgreSQL逻辑备份pg_dump使用及其原理解析

一、原理分析 1、循环调用getopt_long解析命令行参数&#xff0c;将参数保存到static DumpOptions dopt;中 2、判断参数是否相容&#xff0c;不相容则退出&#xff1a; options -s/--schema-only and -a/--data-only cannot be used togetheroptions -c/--clean and -a/--data…

uni-app中监听网络状态,并在嵌入webView页面的组件中添加网络监测

uni-app中监听网络状态&#xff0c;并在嵌入webView页面的组件中添加网络监测 uni-app中监听网络状态 下载插件 打开网络异常组件页面&#xff0c;点击"下载插件并导入HBuilderX"按钮&#xff0c;打开HBuilderX软件后&#xff0c;选择需要导入插件的项目&#xff…

机器学习与模型识别1:SVM(支持向量机)

一、简介 SVM是一种二类分类模型&#xff0c;在特征空间中寻找间隔最大的分离超平面&#xff0c;使得数据得到高效的二分类。 二、SVM损失函数 SVM 的三种损失函数衡量模型的性能。 1. 0-1 损失&#xff1a; 当正例样本落在 y0 下方则损失为 0&#xff0c;否则损失为…