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 singleapplication
Pembuatan:
Kemudian sertakan file singleapplication.pri
di file proyek .pro
Anda.
include ( singleapplication/singleapplication.pri )
DEFINES += QAPPLICATION_CLASS = QApplication
Pembuatan 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/basic
examples/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.