| 42 | |
| 43 | |
| 44 | class QSingleApplication(QApplication): |
| 45 | messageReceived = pyqtSignal(str) |
| 46 | |
| 47 | def __init__(self, *args, **kwargs): |
| 48 | super(QSingleApplication, self).__init__(*args, **kwargs) |
| 49 | appid = QApplication.applicationFilePath().lower().split("/")[-1] |
| 50 | self._socketName = "qtsingleapp-" + appid |
| 51 | print("socketName", self._socketName) |
| 52 | self._activationWindow = None |
| 53 | self._activateOnMessage = False |
| 54 | self._socketServer = None |
| 55 | self._socketIn = None |
| 56 | self._socketOut = None |
| 57 | self._running = False |
| 58 | |
| 59 | # 先尝试连接 |
| 60 | self._socketOut = QLocalSocket(self) |
| 61 | self._socketOut.connectToServer(self._socketName) |
| 62 | self._socketOut.error.connect(self.handleError) |
| 63 | self._running = self._socketOut.waitForConnected() |
| 64 | |
| 65 | if not self._running: # 程序未运行 |
| 66 | self._socketOut.close() |
| 67 | del self._socketOut |
| 68 | self._socketServer = QLocalServer(self) |
| 69 | self._socketServer.listen(self._socketName) |
| 70 | self._socketServer.newConnection.connect(self._onNewConnection) |
| 71 | self.aboutToQuit.connect(self.removeServer) |
| 72 | |
| 73 | def handleError(self, message): |
| 74 | print("handleError message: ", message) |
| 75 | |
| 76 | def isRunning(self): |
| 77 | return self._running |
| 78 | |
| 79 | def activationWindow(self): |
| 80 | return self._activationWindow |
| 81 | |
| 82 | def setActivationWindow(self, activationWindow, activateOnMessage=True): |
| 83 | self._activationWindow = activationWindow |
| 84 | self._activateOnMessage = activateOnMessage |
| 85 | |
| 86 | def activateWindow(self): |
| 87 | if not self._activationWindow: |
| 88 | return |
| 89 | self._activationWindow.setWindowState( |
| 90 | self._activationWindow.windowState() & ~Qt.WindowMinimized) |
| 91 | self._activationWindow.raise_() |
| 92 | self._activationWindow.activateWindow() |
| 93 | |
| 94 | def sendMessage(self, message, msecs=5000): |
| 95 | if not self._socketOut: |
| 96 | return False |
| 97 | if not isinstance(message, bytes): |
| 98 | message = str(message).encode() |
| 99 | self._socketOut.write(message) |
| 100 | if not self._socketOut.waitForBytesWritten(msecs): |
| 101 | raise RuntimeError("Bytes not written within %ss" % |