| 15 | |
| 16 | |
| 17 | class QSingleApplication(QApplication): |
| 18 | |
| 19 | messageReceived = pyqtSignal(str) |
| 20 | |
| 21 | def __init__(self, name, *args, **kwargs): |
| 22 | super(QSingleApplication, self).__init__(*args, **kwargs) |
| 23 | self._socketName = name |
| 24 | self._activationWindow = None |
| 25 | self._socketServer = None |
| 26 | self._socketIn = None |
| 27 | self._socketOut = None |
| 28 | self._running = False |
| 29 | |
| 30 | # 先尝试连接 |
| 31 | self._socketOut = QLocalSocket(self) |
| 32 | self._socketOut.connectToServer(self._socketName) |
| 33 | self._socketOut.error.connect(self.handleError) |
| 34 | self._running = self._socketOut.waitForConnected() |
| 35 | |
| 36 | if not self._running: # 程序未运行 |
| 37 | self._socketOut.close() |
| 38 | del self._socketOut |
| 39 | # 创建本地server |
| 40 | self._socketServer = QLocalServer(self) |
| 41 | self._socketServer.listen(self._socketName) |
| 42 | self._socketServer.newConnection.connect(self._onNewConnection) |
| 43 | self.aboutToQuit.connect(self.removeServer) |
| 44 | |
| 45 | def handleError(self, message): |
| 46 | print("handleError message: ", message) |
| 47 | |
| 48 | def isRunning(self): |
| 49 | return self._running |
| 50 | |
| 51 | def activationWindow(self): |
| 52 | return self._activationWindow |
| 53 | |
| 54 | def setActivationWindow(self, activationWindow): |
| 55 | # 设置需要激活的窗口 |
| 56 | self._activationWindow = activationWindow |
| 57 | |
| 58 | def activateWindow(self): |
| 59 | try: |
| 60 | self._activationWindow.setWindowState( |
| 61 | self._activationWindow.windowState() & ~Qt.WindowMinimized) |
| 62 | # self._activationWindow.raise_() |
| 63 | self._activationWindow.showNormal() |
| 64 | self._activationWindow.activateWindow() |
| 65 | except Exception as e: |
| 66 | print(e) |
| 67 | |
| 68 | def sendMessage(self, message, msecs=5000): |
| 69 | if not self._socketOut: |
| 70 | return False |
| 71 | if not isinstance(message, bytes): |
| 72 | message = str(message).encode() |
| 73 | self._socketOut.write(message) |
| 74 | if not self._socketOut.waitForBytesWritten(msecs): |