PySide 或 PyQt 的 QtSingleApplication [英] QtSingleApplication for PySide or PyQt

查看:38
本文介绍了PySide 或 PyQt 的 QtSingleApplication的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有 C++ 类的 Python 版本QtSingleApplication 来自 Qt Solutions?

Is there a Python version of the C++ class QtSingleApplication from Qt Solutions?

QtSingleApplication 使用以确保同时运行的应用程序实例永远不会超过一个.

QtSingleApplication is used to make sure that there can never be more than one instance of an application running at the same time.

推荐答案

这是我自己的实现.它已经用 Python 2.7 和 PySide 1.1 测试过.

Here is my own implementation. It has been tested with Python 2.7 and PySide 1.1.

它与C++版本的具有基本相同的界面QtSingleApplication.主要区别在于您必须为构造函数提供应用程序唯一 ID.(默认情况下,C++ 版本使用可执行文件的路径作为唯一 ID;这在这里不起作用,因为可执行文件很可能是 python.exe.)

from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtNetwork import *

class QtSingleApplication(QApplication):

    messageReceived = Signal(unicode)

    def __init__(self, id, *argv):

        super(QtSingleApplication, self).__init__(*argv)
        self._id = id
        self._activationWindow = None
        self._activateOnMessage = False

        # Is there another instance running?
        self._outSocket = QLocalSocket()
        self._outSocket.connectToServer(self._id)
        self._isRunning = self._outSocket.waitForConnected()

        if self._isRunning:
            # Yes, there is.
            self._outStream = QTextStream(self._outSocket)
            self._outStream.setCodec('UTF-8')
        else:
            # No, there isn't.
            self._outSocket = None
            self._outStream = None
            self._inSocket = None
            self._inStream = None
            self._server = QLocalServer()
            self._server.listen(self._id)
            self._server.newConnection.connect(self._onNewConnection)

    def isRunning(self):
        return self._isRunning

    def id(self):
        return self._id

    def activationWindow(self):
        return self._activationWindow

    def setActivationWindow(self, activationWindow, activateOnMessage = True):
        self._activationWindow = activationWindow
        self._activateOnMessage = activateOnMessage

    def activateWindow(self):
        if not self._activationWindow:
            return
        self._activationWindow.setWindowState(
            self._activationWindow.windowState() & ~Qt.WindowMinimized)
        self._activationWindow.raise_()
        self._activationWindow.activateWindow()

    def sendMessage(self, msg):
        if not self._outStream:
            return False
        self._outStream << msg << '\n'
        self._outStream.flush()
        return self._outSocket.waitForBytesWritten()

    def _onNewConnection(self):
        if self._inSocket:
            self._inSocket.readyRead.disconnect(self._onReadyRead)
        self._inSocket = self._server.nextPendingConnection()
        if not self._inSocket:
            return
        self._inStream = QTextStream(self._inSocket)
        self._inStream.setCodec('UTF-8')
        self._inSocket.readyRead.connect(self._onReadyRead)
        if self._activateOnMessage:
            self.activateWindow()

    def _onReadyRead(self):
        while True:
            msg = self._inStream.readLine()
            if not msg: break
            self.messageReceived.emit(msg)

这是一个简单的测试程序:

Here is a simple test program:

import sys
from PySide.QtGui import *
from QtSingleApplication import QtSingleApplication

appGuid = 'F3FF80BA-BA05-4277-8063-82A6DB9245A2'
app = QtSingleApplication(appGuid, sys.argv)
if app.isRunning(): sys.exit(0)

w = QWidget()
w.show()
app.setActivationWindow(w)
sys.exit(app.exec_())

这篇关于PySide 或 PyQt 的 QtSingleApplication的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆