Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qt - Afficher sur l'écran le plus grand

Sujet résolu
    13 octobre 2020 à 15:20:18

    Bonjour, dans le cadre de mon travail je dev un programme Qt qui permettra de tracer les courbes correspondants aux résultats d'essais que l'on fait.

    Tous mes collègues ont la même configuration que moi, un Pc portable avec un écran de 1600x900 Pixel et un 2nd écran en 1920x1080px. Dans les paramètres d'affichages Windows, certains collègues ont réglé le grand écran comme écran principale, d'autre ont mis le Pc portable comme écran principale.

    Pour avoir la meilleure lisibilité possible, je voudrais que ma fenêtre qui affiche les courbes s'ouvre automatiquement sur l'écran 1920x1080. Le problème est qu'elle s'ouvre sur l'écran qui est réglé comme écran principale. Voici quelques morceaux de mon code : 

    mainWindow.cpp ==> slot correspondant à mon bouton "Tracer"

    void MainWindow::on_pbPlotCurve_clicked()
    {
        QString titre = ui->curveName->text();
        graphWidget *m_graph = new graphWidget(m_config, titre);
        
        m_graph->show();  // J'affiche la fenêtre vide pour le moment
        m_graph->displayCurves(dataPath);
    }

    dans graphWidget.cpp

    bool graphWidget::displayCurves(const QString &path) {
        QString pathData = path;
    
        createGraphs(); // Je créé et affiche via un layout dans mon widget N graphs vides en fonction de certains paramètres donnés dans ma MainWindow (un QCustomPlot avec plusieurs graphs)
    
        QProgressDialog *qpd = new QProgressDialog();
        qpd->setLabelText("Operation in progress.");
        qpd->setCancelButton(0);
        qpd->setRange(0,0);
        qpd->show();
    
        // -------- Morceau de code qui récupère la résolution de mon écran le plus grand et set la taille de mon widget -------
        QList<QScreen*> lst = QGuiApplication::screens();
        QVector<int> screensWidth;
        QVector<int> screensHeight;
        foreach(auto &screen,lst) {
            screensHeight.push_back(screen->geometry().height());
            screensWidth.push_back(screen->geometry().width());
        }
    
    
        int width = *std::max_element(screensWidth.begin(), screensWidth.end());
        int height = *std::max_element(screensHeight.begin(), screensHeight.end());
        qDebug() << "width = " << width << " / height = " << height;
        this->setGeometry(0,23,width,height-63);    // Affichage du widget à la taille du plus grand écran en laissant les marges visibles
        // -------------------------------------
    
        QString ret;
        QFuture<QString> future = QtConcurrent::run(this, &graphWidget::processDatas,pathData);   // Nécéssaire à l'affichage de mon QProcessDialog
        while(future.isRunning()) {
            QApplication::processEvents();
        }
    
        plt->replot(); // Permet d'afficher les courbes sur les graphs déjà affichés
    
        ret = future.result();
        if(ret.isEmpty()) {
            qpd->close();
            return true;
        }
        else {
            qpd->close();
            QMessageBox::critical(this,"Data value error",ret);
            this->close();
            return false;
        }
        return true;
    }
    
    QString graphWidget::processDatas(QString path) {
        QString ret = getDatasFromFile(path);   // Lit toutes les lignes de mon fichier de data, les traite et stock dans des vector. Return un QString avec des infos en cas d'erreur
    
        if(ret.isEmpty()) // Pas d'erreurs dans le fichier contenant toutes les datats
            addCurvesToGraph(); // Je lie deux QVectors (temps et valeur) à chacun des N graph de mon widget
    
        return ret;
    }

    Je suis donc capable de déterminer la résolution de mon écran le plus grand et de gérer la taille de mon Widget en fonction de ça mais je n'ai aucune idée de comment faire pour afficher le widget sur cet écran si il n'est pas réglé comme écran principale dans widows vu que la fonction show() n'accepte aucun paramètres.

    Quelqu'un aurait-il une idée où une piste que je pourrais explorer ? Merci d'avance 


    • Partager sur Facebook
    • Partager sur Twitter
      14 octobre 2020 à 0:24:03

      QScreen::geometry() ne renvoie pas que la taille de chaque écran, mais également la position de chacun d'eux sur le "bureau étendu", donc si tu places ta fenêtre à l'intérieur du QRect renvoyé par l'écran choisi, ça devrait la placer au bon endroit.

      QRect largestScreen;
      for(auto screen : QApplication::screens()) {
          if(screen->geometry().width() > largestScreen.width() &&
              screen->geometry().height() > largestScreen.height()) {
              largestScreen = screen->geometry();
          }
      }
      this.setGeometry(largestScreen - QMargins(0,23, 0, 40));



      • Partager sur Facebook
      • Partager sur Twitter
        14 octobre 2020 à 8:43:38

        Ca marche et c'est exactement ce que je cherchais, merci :)
        • Partager sur Facebook
        • Partager sur Twitter

        Qt - Afficher sur l'écran le plus grand

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown