我只希望每次運行我的應用程序的一個實例。但是當用戶第二次嘗試打開它時,我希望將第一個窗口置於前面(可以將其最小化或最小化到任務欄的角落,並且用戶不知道如何打開它)pyqt4 - 單一應用程序 - 調出原始窗口以嘗試第二次打開應用程序
我有這個代碼做檢測工作,它不允許第二個實例。我無法打開原始窗口。我已經評論了我的一些嘗試。
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
作爲http://qt.gitorious.org/qt-solutions/qt-solutions/trees/master/qtsingleapplication存在一個純粹的Qt解決方案。他們不使用win32 API調用,而是創建一個QLocalServer。這個類可以接受傳入的本地套接字連接。實質上,他們在此套接字上監聽傳入連接,進行一些驗證,然後接受諸如「帶到前面」之類的消息。它看起來像已經移植到http://stackoverflow.com/questions/8786136/pyqt-how-to-detect-and-close-ui-if-its-already-running – goran
但在這種情況下,我不想要真正的溝通。我只想要你的想法的一個qt版本。使用qt來獲取wid並再次打開它。我做了嘗試,但我無法使它工作。 – Kiarash