Это замена 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 = QApplication
CMake:
Затем включите подкаталог в файл проекта 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/basic
examples/calculator
examples/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.