Ini adalah pengganti QtSingleApplication untuk Qt5 dan Qt6 .
Menyimpan Mesin Virtual Utama Aplikasi Anda dan mematikan setiap mesin virtual berikutnya. Ini dapat (jika diaktifkan) memunculkan instance sekunder (tidak terkait dengan primer) dan dapat mengirim data ke instance utama dari instance sekunder.
Anda dapat menemukan referensi dan contoh penggunaan lengkap di sini.
Kelas SingleApplication mewarisi dari kelas Q[Core|Gui]Application apa pun yang Anda tentukan melalui makro QAPPLICATION_CLASS ( QCoreApplication adalah defaultnya). Penggunaan lebih lanjut mirip dengan penggunaan kelas Q[Core|Gui]Application .
Anda dapat menggunakan perpustakaan seolah-olah Anda menggunakan kelas turunan QCoreApplication lainnya:
# include < QApplication >
# include < SingleApplication.h >
int main ( int argc, char * argv[] )
{
SingleApplication app ( argc, argv );
return app. exec ();
}Untuk memasukkan file perpustakaan, saya sarankan Anda menambahkannya sebagai submodul git ke proyek Anda. Begini caranya:
git submodule add https://github.com/itay-grudev/SingleApplication.git singleapplicationPembuatan:
Kemudian sertakan file singleapplication.pri di file proyek .pro Anda.
include ( singleapplication/singleapplication.pri )
DEFINES += QAPPLICATION_CLASS = QApplicationPembuatan C:
Kemudian sertakan subdirektori dalam file proyek CMakeLists.txt Anda.
set (QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication" )
add_subdirectory (src/third-party/singleapplication)
target_link_libraries ( ${PROJECT_NAME} SingleApplication::SingleApplication) Menyertakan repositori ini secara langsung sebagai submodul Git, atau bahkan hanya salinan kecil kode sumber ke dalam proyek baru mungkin tidak ideal saat menggunakan CMake. Pilihan lainnya adalah menggunakan modul FetchContent CMake, yang tersedia sejak versi 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
)
Perpustakaan menyiapkan blok QLocalServer dan QSharedMemory . Mesin virtual pertama Aplikasi Anda adalah Mesin Virtual Utama Anda. Ini akan memeriksa apakah blok memori bersama ada dan jika tidak maka akan memulai QLocalServer dan mendengarkan koneksi. Setiap instance berikutnya dari aplikasi Anda akan memeriksa apakah blok memori bersama ada dan jika ada, maka akan terhubung ke QLocalServer untuk memberi tahu instance utama bahwa instance baru telah dimulai, setelah itu akan diakhiri dengan kode status 0 . Dalam Instance Utama, SingleApplication akan memancarkan sinyal instanceStarted() setelah mendeteksi bahwa instance baru telah dimulai.
Perpustakaan menggunakan stdlib untuk menghentikan program dengan fungsi exit() .
Jangan lupa juga untuk menentukan kelas QCoreApplication mana yang digunakan aplikasi Anda jika bukan QCoreApplication seperti pada contoh di atas.
Kelas SingleApplication mengimplementasikan sinyal instanceStarted() . Anda dapat mengikat sinyal tersebut untuk memunculkan jendela aplikasi Anda ketika instance baru telah dimulai, misalnya.
// window is a QWindow instance
QObject::connect (
&app,
&SingleApplication::instanceStarted,
&window,
&QWindow::raise
); Menggunakan SingleApplication::instance() adalah cara yang tepat untuk mendapatkan instance SingleApplication untuk mengikat sinyalnya di mana saja dalam program Anda.
Catatan: Pada Windows, kemampuan untuk menampilkan jendela aplikasi ke latar depan dibatasi. Lihat implementasi khusus Windows untuk solusi dan contoh implementasi.
Jika Anda ingin dapat meluncurkan Instans Sekunder tambahan (tidak terkait dengan Instans Utama), Anda harus mengaktifkannya dengan parameter ketiga konstruktor SingleApplication . Standarnya adalah false yang berarti tidak ada Instans Sekunder. Berikut adalah contoh bagaimana Anda memulai Instans Sekunder mengirim pesan dengan argumen baris perintah ke instans utama dan kemudian mematikannya.
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 ();
} Catatan: Instance sekunder tidak akan menyebabkan emisi sinyal instanceStarted() secara default. Lihat SingleApplication::Mode untuk detail selengkapnya.*
Anda dapat memeriksa apakah instans Anda merupakan instans primer atau sekunder dengan metode berikut:
app.isPrimary();
// or
app.isSecondary();Catatan: Jika Instans Utama Anda dihentikan, instans yang baru diluncurkan akan menggantikan instans Utama meskipun tanda Sekunder telah disetel.*
Ada tiga contoh yang disediakan dalam repositori ini:
examples/basicexamples/calculator jendela induknyaexamples/sending_arguments Setiap versi utama membawa perubahan yang sangat signifikan atau tidak kompatibel dengan versi sebelumnya. Versi minor hanya menambahkan fitur tambahan, perbaikan bug, atau peningkatan kinerja dan kompatibel dengan rilis sebelumnya. Lihat CHANGELOG.md untuk lebih jelasnya.
Pustaka diimplementasikan dengan blok QSharedMemory yang aman untuk thread dan menjamin kondisi balapan tidak akan terjadi. Ia juga menggunakan QLocalSocket untuk memberi tahu proses utama bahwa instance baru telah dihasilkan dan dengan demikian memanggil sinyal instanceStarted() dan untuk mengirim pesan ke instance utama.
Selain itu, perpustakaan dapat pulih dari penghentian paksa pada sistem *nix dan akan mengatur ulang blok memori mengingat tidak ada instance lain yang berjalan.
Pustaka ini dan dokumentasi pendukungnya, kecuali contoh kalkulator Qt yang didistribusikan di bawah lisensi BSD, dirilis berdasarkan ketentuan The MIT License (MIT) dengan ketentuan tambahan, yaitu:
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.