UBuntu18.04 Qt之双HDMI屏切换

这篇具有很好参考价值的文章主要介绍了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_OBJECT
 
public:
    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 0
    if(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 0
    if(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显示器分别显示程序的主界面文章来源地址https://www.toymoban.com/news/detail-662772.html

到了这里,关于UBuntu18.04 Qt之双HDMI屏切换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pcl+vtk(二)Ubuntu18.04下载安装基于使用QT的pcl1.13+vtk8.2,以及卸载

    1.Qt版本 Qt5.4以前版本:QVTKWidget2/QVTKWidget。 Qt5.4以后版本:QVTKOpenGLWidget/QVTKOpenGLWidget。 2.VTK版本(Qt版本为5.4之后) 在VTK8.2以前的版本:QVTKOpenGLWidget; 在VTK8.2及以后的版本里:QVTKOpenGLNativeWidget; QVTKWidget:目前了解到的只可显示点云,没有在网上找到显示模型的例子。 QVTKOpen

    2024年02月04日
    浏览(68)
  • ubuntu18.04下opencv多版本安装及切换

    Opencv网站:https://opencv.org/releases/ 查看已安装opencv的版本 建立opencv安装文件夹 下载解压后 安装路径设置:CMAKE_INSTALL_PREFIX=/usr/local/opencv4.5.1 成功图示 1、安装成功后还需要设置opencv的环境变量。打开文件: 2、将opencv3.4.5库文件的路径添加到环境变量中,将以下内容添加到最后

    2024年04月16日
    浏览(63)
  • 在 Ubuntu 18.04 中配置静态 IP 及灵活切换

    Ubuntu 18.04 使用 Netplan 来配置 IP 地址,Netplan 是一个新的命令行网络配置工具。 新的 IP 配置方法不会再用到 /etc/network/interfaces 这个文件,取而代之的是一个 YAML 文件。 默认的 Netplan 配置文件一般在 /etc/netplan 目录下。 查看当前 ip 和 网关 找到 Netplan 默认的网络配置文件所在

    2024年02月06日
    浏览(37)
  • 在 Ubuntu 18.04 中配置静态 IP 地址及灵活切换IP的办法

    Ubuntu 18.04 使用 Netplan 来配置 IP 地址,Netplan 是一个新的命令行网络配置工具。 新的 IP 配置方法不会再用到 /etc/network/interfaces 这个文件,取而代之的是一个 YAML 文件。 默认的 Netplan 配置文件一般在 /etc/netplan 目录下。 首先先找到 Netplan 默认的网络配置文件所在之处: 我们可

    2023年04月23日
    浏览(48)
  • Ubuntu 18.04开发环境搭建

            工作不易,为了避免未来需要重装系统的进行折腾,个人进行了Ubuntu环境配置的整合,方便自己未来能顺畅的配置好开发环境,同时分享给大家。本文多出有转载其他文,并相应的标注了转载内容,如有侵权请联系博主删除。 vmware下载: 链接:https://pan.baidu.com

    2024年02月02日
    浏览(68)
  • Ubuntu 18.04修改系统语言为(中文简体)教程

    目录   说明 步骤 1. 打开系统设置 2. 进入“区域和语言”设置 3. 添加中文语言支持 4. 选择安装简体中文 5. 修改系统语言 6. 重启系统     Ubuntu全程需要联网正常,因为要下一些安装包。   1. 打开系统设置 点击屏幕右上角的系统菜单图标,选择“设置”选项。   2. 进入“区

    2024年02月03日
    浏览(49)
  • ubuntu18.04复现yolo v8环境配置之CUDA与pytorch版本问题以及多CUDA版本安装及切换

    最近在复现yolo v8的程序,特记录一下过程 环境:ubuntu18.04+ros melodic 小知识:GPU并行计算能力高于CPU—B站UP主说的 Ubuntu可以安装多个版本的CUDA。如果某个程序的Pyorch需要不同版本的CUDA,不必删除之前的CUDA,可以实现多版本的CUDA切换 一、查看当前PyTorch使用的CUDA版本: 注意

    2024年02月11日
    浏览(52)
  • Ubunutu18.04+Qt5.14+Dlib19.24+Opencv3.4.16实时人眼监测实验

      在Ubuntu18.04实现的一个人眼监测小程序,使用Qt5.14、Dlib19.24、Opencv3.4.16实现。   其主要实现思想是,首先通过 Opencv 获取摄像头数据,然后通过 Dlib 提取人脸68关键点的算法对所输入图片中的人脸进行关键点检测,检测出眼部的关键点后,在用 Opnecv 中的画图命令进行绘制

    2023年04月13日
    浏览(73)
  • iTOP-RK3568开发板Docker 安装 Ubuntu 18.04

    Docker 下载安装 Ubuntu18.04,输入以下命令: sudo apt update docker pull ubuntu:18.04 切换 Shell 到 Ubuntu 18.04,输入以下命令: docker container run -p 8000:3000 -it ubuntu:18.04 /bin/bash -p 参数:容器的 3000 端口映射到本机的 8000 端口。 -it 参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输

    2024年02月15日
    浏览(49)
  • 如何在Ubuntu 18.04上安装PHP 7.4并搭建本地开发环境

    PHP是一种流行的服务器脚本语言,用于创建动态和交互式web页面。开始使用你选择的语言是学习编程的第一步。 本教程将指导您在Ubuntu上安装PHP 7.4,并通过命令行设置本地编程环境。您还将安装依赖管理器Composer,并通过运行脚本来测试您的安装。 要完成本教程,您需要安

    2024年02月11日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包