導航:首頁 > 編程語言 > 使qt程序只運行一個實例

使qt程序只運行一個實例

發布時間:2024-07-10 18:14:18

⑴ 如何讓Qt應用程序只有一個實例

這就要用到Qt的QLocalSocket,QLocalServer類了,這兩個類從介面上看和網路通信socket沒有區別,但是它並不是真正的網路API,只是模仿了而已。這兩個類在Unix/Linux系統上採用Unix域socket實現,而在Windows上則採用有名管道(named pipe)來實現。
既然是網路API,那麼思路就很簡單了,應用程序啟動時首先會去連一個伺服器(這里通過應用程序的名字來標識,就像網路埠一樣),如果連接失敗,那麼則自己是第一個實例,就創建這么一個伺服器,否則將啟動參數發送到伺服器,然後自動退出,而伺服器會在收到通知以後進行處理。
這些動作我想最好是放在創建Application實例後,因為Qt本身有很多操作沒有Application實例是無法進行操作的(至少事件循環是在創立Application以後才能啟動吧),因此最好的位置就是通過繼承QApplicaiton或者QCoreApplication自定義一個YourOwnApplication,然後在構造函數中進行,下面是一個示意。
首先是YourOwnApplication構造函數:

QString serverName = QCoreApplication::applicationName();
QLocalSocket socket;
socket.connectToServer(serverName);
if (socket.waitForConnected(500)) { //如果能夠連接得上的話,將參數發送到伺服器,然後退出
QTextStream stream(&socket);
QStringList args = QCoreApplication::arguments();
if (args.count() > 1)
stream << args.last();
else
stream << QString();
stream.flush();
socket.waitForBytesWritten();
qApp->quit();
return;
}
//運行到這里,說明沒有實例在運行,那麼創建伺服器。
m_localServer = new QLocalServer(this);
connect(m_localServer, SIGNAL(newConnection()),
this, SLOT(newLocalSocketConnection())); //監聽新到來的連接
if (!m_localServer->listen(serverName)) {
if (m_localServer->serverError() == QAbstractSocket::AddressInUseError
&& QFile::exists(m_localServer->serverName())) { //確保能夠監聽成功
QFile::remove(m_localServer->serverName());
m_localServer->listen(serverName);
}
}

這樣就保證了新啟動的程序在檢測到有其他實例在運行時就會自動退出,但是它發出的請求還沒有被處理,下面看一下處理函數,也就是前段代碼中的newLocalSocketConnection()。
QLocalSocket *socket = m_localServer->nextPendingConnection();
if (!socket)
return;
socket->waitForReadyRead(1000);
QTextStream stream(socket);
… … //其他處理
delete socket;
mainWindow()->raise();
mainWindow()->activateWindow(); //記得激活窗口哦

⑵ 卸載或更改程序里的Qt,好幾個一樣的能否卸載只保留一個

可以,完全可以只保留一個。
一般應保留最新的一個。

閱讀全文

與使qt程序只運行一個實例相關的資料

熱點內容
shell編輯文件內容 瀏覽:614
u盤驅動在哪個文件夾里 瀏覽:938
華為手機跟蘋果手機怎麼克隆app 瀏覽:172
cad文件為什麼顯示文件名是否正確 瀏覽:174
程序配置文件能自動轉換成txt 瀏覽:985
r4燒錄卡不同版本 瀏覽:962
怎麼升級qq群為2000 瀏覽:347
微信己冊除的文件怎樣找回來 瀏覽:715
蘋果美國賬號共享2017 瀏覽:252
ps文件修改後打開還是原圖 瀏覽:220
燒卡機蘋果4微信qq哪裡下載 瀏覽:780
ug120找不到指定文件 瀏覽:522
cda文件怎麼轉換成mp3格式 瀏覽:702
青島hpv疫苗在哪個app預約 瀏覽:881
雙十一成交額2021數據在哪裡看 瀏覽:631
蘋果手機怎麼打開移動數據 瀏覽:637
文件掃描成圖片是彩色的嗎 瀏覽:50
編程里的comply什麼意思 瀏覽:91
電腦上面點了禁用網路怎麼改回來 瀏覽:28
javacatch執行 瀏覽:182

友情鏈接