Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt : 5.12.0 - Qt Creator : 4.8.0 - Qt Installer : 3.0.6 - JOM : 1.1.2 - QBS : 1.12.2

QProcess::startDetached() une seule fenêtre...

6 Oct modifié dans Qt / Langage C++
Bonjour,
Dans une appli C++, sous SEVEN, pour afficher l'emplacement du fichier dont le nom a été cliqué dans un QTextEdit j'utilise:
 QProcess::startDetached(QString("explorer /select, \"%1\"").arg(QDir::toNativeSeparators(fList[i])));
où fList[i] est le chemin du fichier à afficher.

Ca fonctionne bien, la fenêtre du dossier s'ouvre avec le nom du fichier séléectionné.

Seul petit problème, si j'utilise plusieurs fois cette possibilité dans la même application, à chaque sollicitation cela m'ouvre une nouvelle fenêtre pour le même dossier...

Y-a't'il une possibilité de forcer l'utilisation de la fenêtre déjà ouverte ?

Réponses

  • Bon, n'ayant pas eu de solution à cette question, j'ai contourné le problème, à savoir fermé la fenêtre ouverte (correspondant au fichier sélectionné) avant d'en ouvrir une nouvelle...

    Pour cela, une recherche sur le net m'a mis sur la piste TASKLIST, qui permet, moyennant certains indicateurs, d'obtenir le PID de la fenêtre dont on connait le titre (ex. C:\Users\master\Desktop\Gabarits), cf:
    tasklist /NH /FI "windowtitle eq Gabarits"
    NB: j'ai d'abord essayé avec le titre complet, mais sans succès!

    en utilisant QProcess, j'obtiens son PID:

    cde = "windowtitle eq " + s; //où s = absolutePath du fichier soit la dernier partie du titre de la fenêtre
    args << "/NH" << "/FI" << cde;
    proc.start("tasklist",args);
    la sortie du process contient le PID recherché:
    m_buf = QString::fromUtf8(proc.readAllStandardOutput());
    m_buf.remove("\r\n");
    dont on extrait la chaine correspondant au PID, m_id:
    QStringList sL = m_buf.split(QRegExp("\\s"),QString::SkipEmptyParts);
    if (sL.size()>1)
    m_id = sL[1];// PID de la fenêtre si trouvé
    else m_id.clear();
    On peut alors fermer la fenêtre avec TASKKILL avant de poursuivre:
     if (!m_id.isEmpty())
    {
    args << "/PID" << m_id;
    proc.start("taskkill",args);
    C'est la seule solution que j'ai trouvée à mon problème mais ça fonctionne!
    Je n'ai plus qu'une fenêtre ouverte à chaque sélection...
  • Merci pour le retour.
  • Avez-vous pensez à tester avec QDesktopServices ? cela peut rendre votre code portable. Là il est windows specifique.
Connectez-vous ou Inscrivez-vous pour répondre.