在實際應用中,我們經常需要讓應用程式只有乙個例項,再開啟新的文件或者頁面時,只是替換現在的視窗或者新開啟乙個標籤,而不是重新啟動一次應用程式。
qt中是否可以做到這樣呢,答案是肯定的,因為
qt本身可以直接呼叫系統
api,肯定可以做到,但是我們希望找到乙個跨平台的通用的解決方案。
這就要用到qt的
qlocalsocket
,qlocalserver
類了,這兩個類從介面上看和網路通訊
socket
沒有區別,但是它並不是真正的網路
api,只是模仿了而已。這兩個類在
unix/linux
系統上採用
unix
域socket
實現,而在
windows
上則採用有名管道(
named pipe
)來實現。
既然是網路
api,那麼思路就很簡單了,應用程式啟動時首先會去連乙個伺服器(這裡通過應用程式的名字來標識,就像網路埠一樣),如果連線失敗,那麼則自己是第乙個例項,就建立這麼乙個伺服器,否則將啟動引數傳送到伺服器,然後自動退出,而伺服器會在收到通知以後進行處理。
這些動作我想最好是放在建立
例項後,因為
qt本身有很多操作沒有
例項是無法進行操作的(至少事件迴圈是在創立
以後才能啟動吧),因此最好的位置就是通過繼承
或者自定義乙個
,然後在建構函式中進行,下面是乙個示意。
首先是建構函式:
qlocalsocket socket;
socket.connecttoserver(servername);
if (socket.waitforconnected(500))
//執行到這裡,說明沒有例項在執行,那麼建立伺服器。
m_localserver = new qlocalserver(this);
connect(m_localserver, signal(newconnection()),
this, slot(newlocalsocketconnection())); //監聽新到來的連線
if (!m_localserver->listen(servername)) }
這樣就保證了新啟動的程式在檢測到有其他例項在執行時就會自動退出,但是它發出的請求還沒有被處理,下面看一下處理函式,也就是前段**中的
newlocalsocketconnection()。
qlocalsocket
*socket =
m_localserver
->nextpendingconnection();
if(!socket)
return;
socket->waitforreadyread(1000);
qtextstream
stream(socket);
… … //其他處理
deletesocket;
mainwindow()->raise();
mainwindow()->activatewindow(); //記得啟用視窗哦
QT應用程式單例項執行
我們經常會做一些軟體 程式只希望有最多乙個執行例項。我從網上找到了個方法,雖然現在還不太明白原理,但是這種方法總算會用了。原文摘自 int main int argc,char argv if sharemem create 1 return 0 當然別忘了在開頭加上 include 這段 應該不用...
WPF 單例項應用程式
例如 microsoft word,不管開啟多少個文件 也不管它們是如何開啟的 一次只能載入 winword.exe 乙個例項。這便是單例項應用程式。但是最簡單的實現方法,並且也是wpf團隊當前推薦的方法是,使用windows窗體提供的內建支援,這一內建支援最初是用於 visual basic 應用...
Qt 發布應用程式
qt 官方開發環境使用的動態鏈結庫方式,在發布生成的exe程式時,需要複製一大堆 dll,如果自己去複製dll,很可能丟三落四,導致exe在別的電腦裡無法正常執行。因此 qt 官方開發環境裡自帶了乙個工具 windeployqt.exe。以官方 qt 5.8.0 mingw 開發環境為例,從開始選單...