Dies ist ein Ersatz der QtSingleApplication für Qt5
und Qt6
.
Behält die primäre Instanz Ihrer Anwendung und beendet alle nachfolgenden Instanzen. Es kann (sofern aktiviert) sekundäre (nicht mit der primären verknüpfte) Instanzen erzeugen und Daten von sekundären Instanzen an die primäre Instanz senden.
Die vollständige Nutzungsreferenz und Beispiele finden Sie hier.
Die SingleApplication
-Klasse erbt von jeder Q[Core|Gui]Application
Klasse, die Sie über das QAPPLICATION_CLASS
Makro angeben ( QCoreApplication
ist die Standardeinstellung). Die weitere Verwendung ähnelt der Verwendung der Q[Core|Gui]Application
Klassen.
Sie können die Bibliothek wie jede andere QCoreApplication
abgeleitete Klasse verwenden:
# include < QApplication >
# include < SingleApplication.h >
int main ( int argc, char * argv[] )
{
SingleApplication app ( argc, argv );
return app. exec ();
}
Um die Bibliotheksdateien einzubinden, würde ich empfehlen, dass Sie sie als Git-Submodul zu Ihrem Projekt hinzufügen. So geht's:
git submodule add https://github.com/itay-grudev/SingleApplication.git singleapplication
Qmake:
Fügen Sie dann die Datei singleapplication.pri
in Ihre .pro
Projektdatei ein.
include ( singleapplication/singleapplication.pri )
DEFINES += QAPPLICATION_CLASS = QApplication
CMake:
Fügen Sie dann das Unterverzeichnis in Ihre CMakeLists.txt
-Projektdatei ein.
set (QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication" )
add_subdirectory (src/third-party/singleapplication)
target_link_libraries ( ${PROJECT_NAME} SingleApplication::SingleApplication)
Die direkte Einbindung dieses Repositorys als Git-Submodul oder auch nur eine oberflächliche Kopie des Quellcodes in neue Projekte ist bei der Verwendung von CMake möglicherweise nicht ideal. Eine weitere Option ist die Verwendung FetchContent
Moduls von CMake, das seit Version 3.11
verfügbar ist.
# 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
)
Die Bibliothek richtet einen QLocalServer
und einen QSharedMemory
Block ein. Die erste Instanz Ihrer Anwendung ist Ihre primäre Instanz. Es würde prüfen, ob der gemeinsam genutzte Speicherblock vorhanden sei, und wenn nicht, würde es einen QLocalServer
starten und auf Verbindungen warten. Jede nachfolgende Instanz Ihrer Anwendung prüft, ob der gemeinsam genutzte Speicherblock vorhanden ist, und stellt in diesem Fall eine Verbindung zum QLocalServer her, um die primäre Instanz darüber zu informieren, dass eine neue Instanz gestartet wurde. Anschließend wird sie mit dem Statuscode 0
beendet. In der Primärinstanz würde SingleApplication
das Signal instanceStarted()
ausgeben, wenn erkannt wird, dass eine neue Instanz gestartet wurde.
Die Bibliothek verwendet stdlib
um das Programm mit der Funktion exit()
zu beenden.
Vergessen Sie auch nicht anzugeben, welche QCoreApplication
Klasse Ihre App verwendet, wenn es sich nicht wie in den obigen Beispielen QCoreApplication
handelt.
Die SingleApplication
-Klasse implementiert ein instanceStarted()
Signal. Sie können sich an dieses Signal binden, um beispielsweise das Fenster Ihrer Anwendung zu öffnen, wenn eine neue Instanz gestartet wurde.
// window is a QWindow instance
QObject::connect (
&app,
&SingleApplication::instanceStarted,
&window,
&QWindow::raise
);
Die Verwendung von SingleApplication::instance()
ist eine praktische Möglichkeit, die SingleApplication
Instanz für die Bindung an ihre Signale an einer beliebigen Stelle in Ihrem Programm abzurufen.
Hinweis: Unter Windows ist die Möglichkeit, die Anwendungsfenster in den Vordergrund zu bringen, eingeschränkt. Eine Problemumgehung und eine Beispielimplementierung finden Sie unter Windows-spezifische Implementierungen.
Wenn Sie zusätzliche sekundäre Instanzen starten möchten (die nicht mit Ihrer primären Instanz zusammenhängen), müssen Sie dies mit dem dritten Parameter des SingleApplication
-Konstruktors aktivieren. Der Standardwert ist false
was bedeutet, dass keine sekundären Instanzen vorhanden sind. Hier ist ein Beispiel dafür, wie Sie eine sekundäre Instanz starten, eine Nachricht mit den Befehlszeilenargumenten an die primäre Instanz senden und dann herunterfahren würden.
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 ();
}
Hinweis: Eine sekundäre Instanz verursacht standardmäßig nicht die Ausgabe des Signals instanceStarted()
. Weitere Informationen finden Sie SingleApplication::Mode
.*
Mit den folgenden Methoden können Sie überprüfen, ob es sich bei Ihrer Instanz um eine primäre oder sekundäre Instanz handelt:
app.isPrimary();
// or
app.isSecondary();
Hinweis: Wenn Ihre Primärinstanz beendet wird, ersetzt eine neu gestartete Instanz die Primärinstanz, auch wenn das Sekundär-Flag gesetzt wurde.*
In diesem Repository finden Sie drei Beispiele:
examples/basic
startetexamples/calculator
öffnetexamples/sending_arguments
sendet Jede Hauptversion führt entweder sehr bedeutende Änderungen ein oder ist nicht abwärtskompatibel mit der vorherigen Version. Nebenversionen fügen lediglich zusätzliche Funktionen, Fehlerbehebungen oder Leistungsverbesserungen hinzu und sind abwärtskompatibel mit der vorherigen Version. Weitere Einzelheiten finden Sie unter CHANGELOG.md.
Die Bibliothek wird mit einem QSharedMemory
Block implementiert, der Thread-sicher ist und garantiert, dass keine Race-Bedingung auftritt. Außerdem wird ein QLocalSocket
verwendet, um den Hauptprozess darüber zu informieren, dass eine neue Instanz erzeugt wurde, und so das Signal instanceStarted()
aufzurufen und um der primären Instanz eine Nachricht zu senden.
Darüber hinaus kann sich die Bibliothek nach einem gewaltsamen Abbruch auf *nix-Systemen erholen und setzt den Speicherblock zurück, sofern keine anderen Instanzen ausgeführt werden.
Diese Bibliothek und die dazugehörige Dokumentation, mit Ausnahme der Qt-Rechner-Beispiele, die unter der BSD-Lizenz vertrieben werden, werden unter den Bedingungen The MIT License (MIT)
mit der zusätzlichen Bedingung veröffentlicht, dass:
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.