Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Displaying a QLabel on a second screen
Qt 6.11 is out! See what's new in the release blog

Displaying a QLabel on a second screen

Scheduled Pinned Locked Moved General and Desktop
6 Posts 2 Posters 2.8k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    Bitman
    wrote on last edited by
    #1

    Hello,

    I have a weird problem while trying to display in fullscreen a QLabel on a second monitor.

    I have a class CustomLabel which inherits from QLabel, where I just redefined mousePressEvent and keyPressEvent, just to set it to not visible when one of these two events occurs. This CustomLabel is initially not visible and there is two situations where I want to display it in fullscreen:

    • When a second screen is detected, this CustomLabel should become visible, and be displayed in fullscreen on this second screen.

    • When there is one screen, the user can click on a button to set the CustomLabel to fullscreen on this screen.
      I have no problem when I don't mix these two things.

    However, let's say I launch the application with one screen and press the fullscreen button, the CustomLabel become visisble and fullscreen on my screen, normal. I then close it (set it not visible actually) by clicking anywhere on the screen. But then, if I plug a new screen, the CustomLabel may still appear on my first screen (usually, I plug the new screen once, it's working, I unplug it, the QLabel disappears, and when I replug the screen, the QLabel is displayed on my first screen...)

    This bug doesn't seem to be very deterministic, but can't be sure.... So I guess I'm missing something... But what?

    Here is the code I use (just to reproduce the problem):

    mainwindow.cpp
    @#include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <iostream>
    #include <QDesktopWidget>

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);

    _label = new CustomLabel();
    _label->setVisible(false);
    _label->setMinimumSize(200, 200);
    
    QPushButton *button = new QPushButton(tr("fullscreen"));
    setCentralWidget(button);
    
    QDesktopWidget *desktop = QApplication::desktop();
    connect(desktop, SIGNAL(screenCountChanged(int)), this, SLOT(screenCountChanged(int)));
    connect(button, SIGNAL(clicked()), this, SLOT(fullScreen()));
    

    }

    MainWindow::~MainWindow()
    {
    delete ui;
    }

    void MainWindow::screenCountChanged(int count) {
    if (count == 1) {
    _label->setVisible(false);
    } else if (count == 2){
    QDesktopWidget *desktop = QApplication::desktop();
    QRect screenres = desktop->screenGeometry(1);
    _label->move(QPoint(screenres.x(), screenres.y()));
    _label->showFullScreen();
    }

    }

    void MainWindow::fullScreen() {
    if (!_label->isVisible()) {
    _label->move(0, 0);
    _label->showFullScreen();
    }
    }@

    and customlabel.cpp (not much in this one)
    @#include <QKeyEvent>

    #include "customlabel.h"

    CustomLabel::CustomLabel(QWidget * parent): QLabel(parent)
    {
    }

    CustomLabel::~CustomLabel()
    {
    }

    void CustomLabel::mousePressEvent(QMouseEvent * event)
    {
    Q_UNUSED(event);
    setVisible(false);
    }

    void CustomLabel::keyPressEvent(QKeyEvent *event) {
    if (event->key() == Qt::Key_Escape) {
    setVisible(false);
    }
    }@

    Thanks for your help :)

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi,

      Why not check the screen count in fullScreen ? Then you can place the label accordingly

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • B Offline
        B Offline
        Bitman
        wrote on last edited by
        #3

        Thanks for your message,
        For this method, I assume I just use it when I only have one screen.
        The problem can also be reproduced without using this button, if I launch the application, then plug a new monitor, the QLabel will be displayed in fullscreen on this second monitor.
        However, if I unplug it and then replug it, the QLabel is displayed on my first screen...

        1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #4

          Can you compare the geometries of all screens before and after you plug/replug your second screen ?

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          0
          • B Offline
            B Offline
            Bitman
            wrote on last edited by
            #5

            Okay, well I have no problem of monitor geometries, but I found this:
            I changed this method:
            @void MainWindow::screenCountChanged(int count) {
            if (count == 1) {
            _label->setVisible(false);
            } else if (count == 2){
            QDesktopWidget *desktop = QApplication::desktop();
            QRect screenres = desktop->screenGeometry(1);
            std::cerr << "second screen resolution: " << screenres.width() << " x " << screenres.height() << std::endl;
            _label->move(QPoint(screenres.x(), screenres.y()));
            std::cerr << "_label moved to: " << screenres.x() << " x " << screenres.y() << std::endl;
            std::cerr << "_label size before being displayed" << _label->width() << " x " << _label->height() << std::endl;
            _label->showFullScreen();
            std::cerr << "_label size after being displayed" << _label->width() << " x " << _label->height() << std::endl;
            }
            }@

            And the output:
            When I first plug the second monitor:
            second screen resolution: 1920 x 1080
            _label moved to: 1366 x 768
            _label size before being displayed640 x 480
            _label size after being displayed1920 x 1080
            (Everything is okay)

            When I unplug it and plug it back:
            second screen resolution: 1920 x 1080
            _label moved to: 1366 x 768
            _label size before being displayed1366 x 768
            _label size after being displayed1366 x 768

            My second monitor has a resolution of 19201080, while my main monitor has 1366768...

            1 Reply Last reply
            0
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on last edited by
              #6

              Can you show each screenres values ?

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              0

              • Login

              • Login or register to search.
              • First post
                Last post
              0
              • Categories
              • Recent
              • Tags
              • Popular
              • Users
              • Groups
              • Search
              • Get Qt Extensions
              • Unsolved