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

相关推荐
小肝一下2 分钟前
多态(上)
android·开发语言·c++·vscode·多态·面向对象·伊蕾娜
魔力女仆10 小时前
分享一个 JS 鼠标跟随贪吃蛇背景库
开发语言·javascript·计算机外设
2401_8949155311 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
麻瓜老宋11 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十二步,分号赋值链式修复、TOKEN_ASSIGN
c语言·开发语言·atomcode
颜x小13 小时前
[C#] C++与c#语法对比
开发语言·c++·c#
weixin_4236521314 小时前
C#使用JObject
开发语言·c#
国科安芯14 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
霸道流氓气质15 小时前
Java中集成Smile 技术教程:从入门到工程实践
java·开发语言
BerrySen17816 小时前
迈向 Next-Gen Java:企业级高并发架构演进与大模型 Agent 落地深度实战
java·开发语言·架构
用户84024097360816 小时前
使用 PyQt5 打造功能完备的 PDF 编辑器:从设计到实现全解析
qt