成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

移動開發
Qt開放源代碼,并且提供自由軟件的用戶協議。使得它可以被廣泛地應用在各平臺上的開放源代碼軟件開發中QLocalSocket 提供了一個本地的套接字

在實際應用中,我們經常需要讓應用程序只有一個實例,再打開新的文檔或者頁面時,只是替換現在的窗口或者新打開一個標簽,而不是重新啟動一次應用程序。Qt中是否可以做到這樣呢,答案是肯定的,因為Qt本身可以直接調用系統API,肯定可以做到,但是我們希望找到一個跨平臺的通用的解決方案。

這就要用到Qt的QLocalSocket,QLocalServer類了,這兩個類從接口上看和網絡通信socket沒有區別,但是它并不是真正的網絡API,只是模仿了而已。這兩個類在Unix/Linux系統上采用Unix域socket實現,而在Windows上則采用有名管道(named pipe)來實現。

既然是網絡API,那么思路就很簡單了,應用程序啟動時首先會去連一個服務器(這里通過應用程序的名字來標識,就像網絡端口一樣),如果連接失敗,那么則自己是第一個實例,就創建這么一個服務器,否則將啟動參數發送到服務器,然后自動退出,而服務器會在收到通知以后進行處理。

這些動作我想最好是放在創建Application實例后,因為Qt本身有很多操作沒有Application實例是無法進行操作的(至少事件循環是在創立Application以后才能啟動吧),因此最好的位置就是通過繼承QApplicaiton或者QCoreApplication自定義一個YourOwnApplication,然后在構造函數中進行,下面是一個示意。

首先是YourOwnApplication構造函數:

 

  1. QString serverName = QCoreApplication::applicationName();  
  2.     QLocalSocket socket;  
  3.     socket.connectToServer(serverName);  
  4.     if (socket.waitForConnected(500)) { //如果能夠連接得上的話,將參數發送到服務器,然后退出  
  5.         QTextStream stream(&socket);  
  6.         QStringList args = QCoreApplication::arguments();  
  7.         if (args.count() > 1)  
  8.             stream << args.last();  
  9.         else  
  10.             stream << QString();  
  11.         stream.flush();  
  12.         socket.waitForBytesWritten();  
  13. qApp->quit();  
  14.         return;  
  15. }  
  16. //運行到這里,說明沒有實例在運行,那么創建服務器。  
  17.     m_localServer = new QLocalServer(this);  
  18.     connect(m_localServer, SIGNAL(newConnection()),  
  19.             this, SLOT(newLocalSocketConnection())); //監聽新到來的連接  
  20.     if (!m_localServer->listen(serverName)) {  
  21.         if (m_localServer->serverError() == QAbstractSocket::AddressInUseError  
  22.            && QFile::exists(m_localServer->serverName())) { //確保能夠監聽成功  
  23.             QFile::remove(m_localServer->serverName());  
  24.             m_localServer->listen(serverName);  
  25.         }  
  26.     } 

這樣就保證了新啟動的程序在檢測到有其他實例在運行時就會自動退出,但是它發出的請求還沒有被處理,下面看一下處理函數,也就是前段代碼中的newLocalSocketConnection()。

  1. QLocalSocket *socket = m_localServer->nextPendingConnection();  
  2.     if (!socket)  
  3.         return;  
  4.     socket->waitForReadyRead(1000);  
  5.     QTextStream stream(socket);  
  6.    … … //其他處理  
  7.     delete socket;  
  8.     mainWindow()->raise();  
  9.     mainWindow()->activateWindow(); //記得激活窗口哦 

【編輯推薦】

 Qt Symbian SDK 安裝

用Qt為Symbian開發應用程序

諾基亞發布Qt SDK 1.1正式版

詳解Qt Lighthouse和Wayland

QML教程:Qt-Quick六大開源組件

Qt和KDE在未來將面臨新的挑戰和機遇

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-05-11 10:58:39

iOS

2011-01-20 07:16:48

Web程序員

2011-06-09 09:12:12

QT symbian

2011-08-10 17:24:05

SQL語句嵌入式SQLJava

2023-05-19 08:49:58

SQLAlchemy數據庫

2010-08-13 13:05:30

Flex應用程序

2013-01-11 14:45:43

iOS開發移動應用iPhone

2020-10-11 20:54:39

Python開發Docker

2011-03-15 19:45:27

Windows Azu

2021-07-14 17:39:46

ReactRails API前端組件

2023-09-21 08:00:00

ChatGPT編程工具

2009-10-19 14:14:19

OSGi Web應用

2012-12-07 10:15:53

IBMdW

2013-05-13 09:31:29

Web App開發WebApp

2022-10-21 14:21:46

JavaScript筆記技能

2011-06-08 10:01:36

Windows Pho 應用程序

2011-03-10 10:45:47

Azure“Hello Worl

2011-06-08 10:24:38

Windows Pho 應用程序

2011-06-14 14:57:06

QT Python GUI

2011-05-03 09:14:45

QtOvi商店Symbian
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品电影在线观看 | 国产成人精品一区二区三区在线 | 91不卡在线| 久久机热 | 国产精品美女久久久久久久网站 | 国产精品国产三级国产aⅴ原创 | 琪琪午夜伦伦电影福利片 | 国产成人精品一区二区三区网站观看 | 久久香蕉精品视频 | www.日韩免费 | 久久久久亚洲 | 国产精品视频久久久 | 亚洲视频免费在线观看 | 午夜影院在线观看 | 精品国产免费一区二区三区五区 | 国产综合精品一区二区三区 | 99精品欧美一区二区蜜桃免费 | 91影院在线观看 | 欧美aaaaaaaa| 九色一区| 欧美在线色 | 成人欧美一区二区三区黑人孕妇 | 日本手机看片 | 天天干夜夜拍 | 成人午夜精品 | 国产一区二区在线观看视频 | 亚洲人成人一区二区在线观看 | 最新中文字幕在线 | 91精品国产91久久综合桃花 | 99久久婷婷国产精品综合 | 最新中文字幕久久 | 精品中文字幕久久 | 龙珠z国语版在线观看 | 亚洲久草 | 久久精品一二三影院 | 国产一区二区三区四区五区加勒比 | 国产日韩一区二区 | 国产99久久精品一区二区300 | 色约约视频 | 国产精品欧美一区二区三区不卡 | 黄色一级特级片 |