Я хочу, чтобы только один экземпляр моего приложения запускался в каждый момент. но когда пользователь пытается открыть его во второй раз, я хочу, чтобы первое окно было перенесено на передний план (его можно было просто свести к минимуму или свести к минимуму до угла панели задач, а пользователь не знает, как его открыть)pyqt4 - singleapplication - вывести исходное окно в попытке открыть приложение во второй раз
У меня есть этот код, который выполняет задание обнаружения, и он не позволяет второму экземпляру. У меня проблемы с частью, что он должен открыть исходное окно. Я прокомментировал некоторые из моих попыток.
import sys
from PyQt4 import QtGui, QtCore
import sys
class SingleApplication(QtGui.QApplication):
def __init__(self, argv, key):
QtGui.QApplication.__init__(self, argv)
self._activationWindow=None
self._memory = QtCore.QSharedMemory(self)
self._memory.setKey(key)
if self._memory.attach():
self._running = True
else:
self._running = False
if not self._memory.create(1):
raise RuntimeError(
self._memory.errorString().toLocal8Bit().data())
def isRunning(self):
return self._running
def activationWindow(self):
return self._activationWindow
def setActivationWindow(self, activationWindow):
self._activationWindow = activationWindow
def activateWindow(self):
if not self._activationWindow:
return
self._activationWindow.setWindowState(
self._activationWindow.windowState() & ~QtCore.Qt.WindowMinimized)
self._activationWindow.raise_()
self._activationWindow.activateWindow()
class Window(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.label = QtGui.QLabel(self)
self.label.setText("Hello")
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.label)
if __name__ == '__main__':
key = 'random _ text'
app = SingleApplication(sys.argv, key)
if app.isRunning():
#app.activateWindow()
sys.exit(1)
window = Window()
#app.setActivationWindow(window)
#print app.topLevelWidgets()[0].winId()
window.show()
sys.exit(app.exec_())
Я считаю, что должна быть PyQt решения для этого, которое будет работать между различными операционными системами. – Kiarash
Реальное решение Qt существует для этого как http://qt.gitorious.org/qt-solutions/qt-solutions/trees/master/qtsingleapplication. Вместо использования вызовов win32 api они создают QLocalServer. Этот класс позволяет принимать входящие локальные соединения сокетов. По сути, они прослушивают входящие соединения в этом сокете, выполняют некоторую проверку и затем принимают такие сообщения, как «принести на передний план». Похоже, что это было портировано по адресу http://stackoverflow.com/questions/8786136/pyqt-how-to-detect-and-close-ui-if-its-already-running – goran
, но в этом случае я не хочу по-настоящему общаться. Я просто хочу версию qt вашей идеи. используя qt, чтобы получить вилку и снова открыть ее. Я попытался, но я не могу заставить его работать. – Kiarash