IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
FAQ Qt FAQ Qt Creator FAQ PyQt & PySide

FAQ Qt

FAQ QtConsultez toutes les FAQ

Nombre d'auteurs : 26, nombre de questions : 298, dernière mise à jour : 15 juin 2021 

 
OuvrirSommaireModulesQt CoreQApplication

Historiquement, la fonction main() était de type void et ne recevait aucun paramètre. Plus récemment, une évolution de l'usage de main a consisté à l'introduction des arguments int argc et char *argv[]. Ces arguments sont complémentaires : char *argv[] représente un tableau de pointeurs dont la taille est définie par int argc. Typiquement, argv[0] contient le nom du fichier de l'exécutable, avec son chemin complet, tandis que les paramètres suivants, optionnels, peuvent contenir une liste de noms de fichiers à traiter par le programme et/ou des options à prendre en compte, auquel cas argc > 1.

Il est possible de récupérer les arguments à l'aide de la fonction QCoreApplication::arguments, qui contiendra par exemple le nom de fichier passé en paramètre au lancement du programme. Si un fichier est ouvert par notre application (par le biais d'un "ouvrir avec", ou par une association de fichier), c'est le nom de ce fichier qui sera passé en paramètre. Le code suivant permet d'attribuer à la variable nom_fichier le paramètre passé à l'application, s'il existe, ou une chaîne vide dans le cas contraire.

 
Sélectionnez
QStringList args = QCoreApplication::arguments();
// Toujours tester si le paramètre existe, avant de l'utiliser
QString nom_fichier = (argc > 1 ? args[1] : "";

Note : la déclaration de la fonction main() doit contenir les arguments mentionnés :

 
Sélectionnez
int main (int argc, char *argv[])
{
    QApplication app(argc,argv)
    // Suite du code
}

Remarque : en règle générale, le premier élément correspond au nom de l'exécutable. Suivant la plateforme et le mode d'exécution, cet élément peut aussi contenir le chemin relatif ou le chemin absolu de l'exécutable concaténé avec son nom.

L'exemple suivant illustre une manière de traiter le premier argument passé à l'application.

 
Sélectionnez
const QStringList args = QCoreApplication::arguments();
// Si le programme a été ouvert par le biais d'un fichier
if(args.count() > 1)
{
    // On récupère le chemin du fichier...
    QString nom_fichier = args[1];
    // ... et on appelle une éventuelle fonction de lecture
    lireFichier(nom_fichier, this);
}
// ...

Attention : sous macOS, le double-clic sur un fichier ne sera pas renseigné dans les arguments, contrairement à Windows et Linux. Pour cela il faut utiliser QFileOpenEvent.

Mis à jour le 7 mai 2012  par Louis du Verdier

Qt fournit, à partir sa version 4.4, la classe QSharedMemory. Celle-ci permet la création de zones de mémoire partagées entre plusieurs applications. C'est en créant une zone mémoire partagée unique à notre application et en vérifiant au début du programme si celle-ci existe déjà que nous allons savoir si notre application est déjà lancée.

 
Sélectionnez
#include <QSharedMemory>
#include <QPushButton>
#include <QMessageBox>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    /* Création de la zone de mémoire partagée identifiée par une chaîne de caractères.
    *  On utilisera un GUID pour avoir un identifiant unique pour qu'il n'y ait pas de conflit
    *  possible avec d'autres applications    */
    QSharedMemory sharedMemory("{69B55631-A712-4d8c-8852-A8ED297EF439}");

    // On vérifie à la création de cette zone mémoire si celle-ci existe
    if(sharedMemory.create(sizeof(int))==false)
    {
        // Utilisation d'une QMessageBox pour prévenir l'utilisateur que le programme est déjà lancé
        QMessageBox msgBox;
        msgBox.setText("L'application est déjà lancée");
        msgBox.exec();
        return 1; // On ferme l'application
    }

    QPushButton button("Hello Qt");
    button.show();
    return a.exec();
}

Les classes QtSingleApplication et QtSingleCoreApplication permettent également d'effectuer cette vérification. Elles sont présentes dans les Qt Solutions sous licence LGPL.

Mis à jour le 8 avril 2017  par François Jaffré

La combinaison Alt+F4 est gérée par Windows et Qt n'a aucun contrôle dessus. Vous pouvez essayer de contourner ceci en utilisant un QTimer pour calculer le temps entre l'appui sur la touche Alt et le moment où vous recevez l'événement closeEvent(), déclenché par Windows après un Alt+F4. Si closeEvent() est reçu avant, disons, 300 millisecondes vous pouvez ignorer l'événement et supposer que Alt+F4 a été utilisé. Voici un exemple :

 
Cacher/Afficher le codeSélectionnez
Créé le 7 mai 2012  par Alexandre Laurent

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 - 2017 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.