Это замена QtSingleApplication для Qt5 и Qt6 .
Сохраняет основной экземпляр вашего приложения и уничтожает каждый последующий экземпляр. Он может (если включен) создавать вторичные (не связанные с основным) экземпляры и отправлять данные в основной экземпляр из вторичных экземпляров.
Полный справочник по использованию и примеры можно найти здесь.
Класс SingleApplication наследует любой класс Q[Core|Gui]Application который вы указываете с помощью макроса QAPPLICATION_CLASS ( QCoreApplication используется по умолчанию). Дальнейшее использование аналогично использованию классов Q[Core|Gui]Application .
Вы можете использовать библиотеку так же, как если бы вы использовали любой другой производный класс QCoreApplication :
# include < QApplication >
# include < SingleApplication.h >
int main ( int argc, char * argv[] )
{
SingleApplication app ( argc, argv );
return app. exec ();
}Чтобы включить файлы библиотеки, я бы рекомендовал вам добавить их в качестве подмодуля git в ваш проект. Вот как:
git submodule add https://github.com/itay-grudev/SingleApplication.git singleapplicationКмейк:
Затем включите файл singleapplication.pri в файл проекта .pro .
include ( singleapplication/singleapplication.pri )
DEFINES += QAPPLICATION_CLASS = QApplicationCMake:
Затем включите подкаталог в файл проекта 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) Непосредственное включение этого репозитория в качестве подмодуля Git или даже просто поверхностной копии исходного кода в новые проекты может быть не идеальным решением при использовании CMake. Другой вариант — использование модуля FetchContent CMake, доступного начиная с версии 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
)
Библиотека устанавливает блок QLocalServer и QSharedMemory . Первый экземпляр вашего приложения — это ваш основной экземпляр. Он проверит, существует ли блок общей памяти, а если нет, запустит QLocalServer и прослушивает соединения. Каждый последующий экземпляр вашего приложения будет проверять, существует ли блок общей памяти, и если да, то он подключится к QLocalServer, чтобы уведомить основной экземпляр о запуске нового экземпляра, после чего он завершится с кодом состояния 0 . В первичном экземпляре SingleApplication будет выдавать сигнал instanceStarted() при обнаружении запуска нового экземпляра.
Библиотека использует stdlib для завершения программы с помощью функции exit() .
Также не забудьте указать, какой класс QCoreApplication использует ваше приложение, если это не QCoreApplication как в примерах выше.
Класс SingleApplication реализует сигнал instanceStarted() . Вы можете привязаться к этому сигналу, чтобы открыть окно вашего приложения, например, при запуске нового экземпляра.
// window is a QWindow instance
QObject::connect (
&app,
&SingleApplication::instanceStarted,
&window,
&QWindow::raise
); Использование SingleApplication::instance() — это удобный способ получить экземпляр SingleApplication для привязки к его сигналам в любом месте вашей программы.
Примечание. В Windows возможность вывода окон приложений на передний план ограничена. См. конкретные реализации Windows для обходного пути и примера реализации.
Если вы хотите иметь возможность запускать дополнительные вторичные экземпляры (не связанные с вашим основным экземпляром), вам необходимо включить это с помощью третьего параметра конструктора SingleApplication . По умолчанию установлено значение false , что означает отсутствие вторичных экземпляров. Вот пример того, как запустить вторичный экземпляр, отправить сообщение с аргументами командной строки основному экземпляру, а затем выключить его.
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 ();
} Примечание. По умолчанию вторичный экземпляр не вызывает выдачу сигнала instanceStarted() . Дополнительную информацию см. в SingleApplication::Mode .*
Вы можете проверить, является ли ваш экземпляр первичным или вторичным, следующими методами:
app.isPrimary();
// or
app.isSecondary();Примечание. Если ваш основной экземпляр будет закрыт, новый запущенный экземпляр заменит основной, даже если установлен флаг «Вторичный».*
В этом репозитории представлены три примера:
examples/basicexamples/calculatorexamples/sending_arguments Каждая основная версия вносит либо очень существенные изменения, либо не имеет обратной совместимости с предыдущей версией. Второстепенные версии добавляют только дополнительные функции, исправления ошибок или улучшения производительности и обратно совместимы с предыдущим выпуском. Подробности смотрите на CHANGELOG.md.
Библиотека реализована с помощью блока QSharedMemory , который является потокобезопасным и гарантирует отсутствие состояния гонки. Он также использует QLocalSocket для уведомления основного процесса о создании нового экземпляра и, таким образом, для вызова сигнала instanceStarted() и для обмена сообщениями с основным экземпляром.
Кроме того, библиотека может восстановиться после принудительного закрытия в системах *nix и сбросить блок памяти, если другие экземпляры не работают.
Эта библиотека и сопровождающая ее документация, за исключением примеров калькулятора Qt, которые распространяются под лицензией BSD, выпускаются на условиях The MIT License (MIT) с дополнительным условием:
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.