當Qt應用只允許啓動一個實例時,可以使用QSingleApplication來實現。
QSingleApplication是Qt提供的一個qt-solution,它不包含在Qt的library中,相關例程卡參考其對應目錄下的doc和example。
本文介紹的SingleApplication,是在Qt5中對QtSingleApplication的替換,它保留應用程序的主實例並終止每個後續實例,同時它也可以(如果啓用)生成輔助實例(與主實例無關),並可以從輔助實例向主實例發送數據。
SingleApplication使用
SingleApplication類可通過宏變量QAPPLICATION_CLASS
來設置其繼承自QCoreApplication
或QApplication
(默認是QCoreApplication
)。
類庫中使用了QLocalServer
和QSharedmemory
塊。應用程序的第一個實例爲主實例,它會檢查共享內存塊是否存在,如不存在則會啓動一個QLocalServer
來監聽連接。每個後續實例會去檢測共享內存是否存在,如存在,它將連接到QLocalServer,並通知主實例啓動了一個新實例,之後會已狀態0終止實例。在主實例中,SingleApplication將發出instanceStarted()
信號,即檢測到新實例已經啓動。
例子
main.cpp
#include <QApplication>
#include <SingleApplication.h>
int main( int argc, char* argv[] )
{
SingleApplication app( argc, argv );
return app.exec();
}
在pro文件中添加
include(singleapplication/singleapplication.pri)
DEFINES += QAPPLICATION_CLASS=QApplication
# DEFINES += QAPPLICATION_CLASS=QCoreApplication
Instance Started信號
SingleApplication類實現了一個instanceStarted()
信號,綁定到該信號後可以在應用程序中檢測是否有新實例正在啓動,如
// window is a QWindow instance
QObject::connect(
&app,
&SingleApplication::instanceStarted,
&window,
&QWindow::raise
);
輔助實例
如果想要啓動額外的輔助實例(與主實例無關),需要啓用SingleApplicaion
構造函數的第三個參數,該參數默認爲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()
信號。可以通過以下方式來區分主實例和輔助實例:
app.isPrimary();
// or
app.isSecondary();
注:如果主實例終止後,即使在輔助實例已經設置的情況下,新啓動的實例會替代主實例。
API
成員函數
SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 100 )
構造函數
bool SingleApplication::sendMessage( QByteArray message, int timeout = 100 )
向主實例發送信息。
bool SingleApplication::isPrimary()
是否爲主實例。
bool SingleApplication::isSecondary()
是否爲輔助實例
quint32 SingleApplication::instanceId()
返回當前實例的ID號。
qint64 SingleApplication::primaryPid()
返回主實例ID。
QString SingleApplication::primaryUser()
返回運行主實例的用戶名。
QString SingleApplication::currentUser()
返回運行當前實例的用戶名。
信號
void SingleApplication::instanceStarted()
新實例啓動時觸發,輔助實例設置爲
Mode::SecondaryNotification
標記時不觸發。
void SingleApplication::receivedMessage( quint32 instanceId, QByteArray message )
從輔助實例接受信息。