Il s'agit d'un remplacement de QtSingleApplication pour Qt5
et Qt6
.
Conserve l'instance principale de votre application et tue chaque instance suivante. Il peut (s'il est activé) générer des instances secondaires (non liées à l'instance principale) et envoyer des données à l'instance principale à partir d'instances secondaires.
Vous pouvez trouver la référence d’utilisation complète et des exemples ici.
La classe SingleApplication
hérite de la classe Q[Core|Gui]Application
que vous spécifiez via la macro QAPPLICATION_CLASS
( QCoreApplication
est la classe par défaut). Une utilisation ultérieure est similaire à l'utilisation des classes Q[Core|Gui]Application
.
Vous pouvez utiliser la bibliothèque comme si vous utilisiez n'importe quelle autre classe dérivée QCoreApplication
:
# include < QApplication >
# include < SingleApplication.h >
int main ( int argc, char * argv[] )
{
SingleApplication app ( argc, argv );
return app. exec ();
}
Pour inclure les fichiers de la bibliothèque, je vous recommande de l'ajouter en tant que sous-module git à votre projet. Voici comment :
git submodule add https://github.com/itay-grudev/SingleApplication.git singleapplication
Qmake :
Incluez ensuite le fichier singleapplication.pri
dans votre fichier de projet .pro
.
include ( singleapplication/singleapplication.pri )
DEFINES += QAPPLICATION_CLASS = QApplication
CMake :
Incluez ensuite le sous-répertoire dans votre fichier de projet CMakeLists.txt
.
set (QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication" )
add_subdirectory (src/third-party/singleapplication)
target_link_libraries ( ${PROJECT_NAME} SingleApplication::SingleApplication)
Inclure directement ce référentiel en tant que sous-module Git, ou même simplement une copie superficielle du code source dans de nouveaux projets, n'est peut-être pas idéal lors de l'utilisation de CMake. Une autre option consiste à utiliser le module FetchContent
de CMake, disponible depuis la version 3.11
.
# Define the minumun CMake version, as an example 3.24
cmake_minimum_required ( VERSION 3.24)
# Include the module
include (FetchContent)
# If using Qt6, override DEFAULT_MAJOR_VERSION
set (QT_DEFAULT_MAJOR_VERSION 6 CACHE STRING "Qt version to use, defaults to 6" )
# Set QAPPLICATION_CLASS
set (QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication" )
# Declare how is the source going to be obtained
FetchContent_Declare(
SingleApplication
GIT_REPOSITORY https://github.com/itay-grudev/SingleApplication
GIT_TAG master
#GIT_TAG e22a6bc235281152b0041ce39d4827b961b66ea6
)
# Fetch the repository and make it available to the build
FetchContent_MakeAvailable(SingleApplication)
# Then simply use find_package as usual
find_package (SingleApplication)
# Finally add it to the target_link_libraries() section
target_link_libraries (ClientePOS PRIVATE
Qt ${QT_VERSION_MAJOR} ::Widgets
Qt ${QT_VERSION_MAJOR} ::Network
Qt ${QT_VERSION_MAJOR} ::Sql
SingleApplication::SingleApplication
)
La bibliothèque met en place un bloc QLocalServer
et QSharedMemory
. La première instance de votre application est votre instance principale. Il vérifierait si le bloc de mémoire partagée existe et sinon, il démarrerait un QLocalServer
et écouterait les connexions. Chaque instance suivante de votre application vérifiera si le bloc de mémoire partagée existe et si c'est le cas, elle se connectera au QLocalServer pour informer l'instance principale qu'une nouvelle instance a été démarrée, après quoi elle se terminera avec le code d'état 0
. Dans l'instance principale, SingleApplication
émettrait le signal instanceStarted()
lors de la détection du démarrage d'une nouvelle instance.
La bibliothèque utilise stdlib
pour terminer le programme avec la fonction exit()
.
N'oubliez pas non plus de spécifier quelle classe QCoreApplication
votre application utilise si ce n'est pas QCoreApplication
comme dans les exemples ci-dessus.
La classe SingleApplication
implémente un signal instanceStarted()
. Vous pouvez vous lier à ce signal pour ouvrir la fenêtre de votre application lorsqu'une nouvelle instance a été démarrée, par exemple.
// window is a QWindow instance
QObject::connect (
&app,
&SingleApplication::instanceStarted,
&window,
&QWindow::raise
);
Utiliser SingleApplication::instance()
est un moyen efficace d'obtenir l'instance SingleApplication
pour la lier à ses signaux n'importe où dans votre programme.
Remarque : Sous Windows, la possibilité de mettre les fenêtres d'application au premier plan est limitée. Consultez Implémentations spécifiques à Windows pour une solution de contournement et un exemple d’implémentation.
Si vous souhaitez pouvoir lancer des instances secondaires supplémentaires (non liées à votre instance principale), vous devez l'activer avec le troisième paramètre du constructeur SingleApplication
. La valeur par défaut est false
, ce qui signifie aucune instance secondaire. Voici un exemple de la façon dont vous démarreriez une instance secondaire, enverriez un message avec les arguments de ligne de commande à l'instance principale, puis l'arrêteriez.
int main ( int argc, char *argv[])
{
SingleApplication app ( argc, argv, true );
if ( app. isSecondary () ) {
app. sendMessage ( app. arguments (). join ( ' ' )). toUtf8 () );
app. exit ( 0 );
}
return app. exec ();
}
Remarque : Une instance secondaire ne provoquera pas l'émission du signal instanceStarted()
par défaut. Voir SingleApplication::Mode
pour plus de détails.*
Vous pouvez vérifier si votre instance est principale ou secondaire avec les méthodes suivantes :
app.isPrimary();
// or
app.isSecondary();
Remarque : Si votre instance principale est résiliée, une instance nouvellement lancée remplacera l'instance principale même si l'indicateur secondaire a été défini.*
Il existe trois exemples fournis dans ce référentiel :
examples/basic
examples/calculator
examples/sending_arguments
Chaque version majeure introduit des changements très importants ou n'est pas rétrocompatible avec la version précédente. Les versions mineures ajoutent uniquement des fonctionnalités supplémentaires, des corrections de bugs ou des améliorations de performances et sont rétrocompatibles avec la version précédente. Voir CHANGELOG.md pour plus de détails.
La bibliothèque est implémentée avec un bloc QSharedMemory
qui est thread-safe et garantit qu'une condition de concurrence critique ne se produira pas. Il utilise également un QLocalSocket
pour informer le processus principal qu'une nouvelle instance a été générée et ainsi invoquer le signal instanceStarted()
et pour envoyer un message à l'instance principale.
De plus, la bibliothèque peut récupérer après avoir été tuée de force sur les systèmes * nix et réinitialisera le bloc de mémoire étant donné qu'aucune autre instance n'est en cours d'exécution.
Cette bibliothèque et sa documentation de support, à l'exception des exemples de calculatrice Qt qui sont distribués sous la licence BSD, sont publiées sous les termes de The MIT License (MIT)
avec une condition supplémentaire :
Permission is not granted to use this software or any of the associated files
as sample data for the purposes of building machine learning models.