Maya + PyQt对话框。如何运行Qt窗口的单个副本?

时间:2015-02-18 15:22:23

标签: python-2.7 pyqt pyqt4 maya

使用这个简单的代码来运行基于qdialog的窗口:

import maya.OpenMayaUI as mui
import sip
from PyQt4 import QtGui, QtCore, uic

#----------------------------------------------------------------------
def getMayaWindow():
    ptr = mui.MQtUtil.mainWindow()
    return sip.wrapinstance(long(ptr), QtCore.QObject)

#----------------------------------------------------------------------
form_class, base_class = uic.loadUiType('perforceBrowserWnd.ui')

#----------------------------------------------------------------------
class PerforceWindow(base_class, form_class):
    def __init__(self, parent=getMayaWindow()):
        super(base_class, self).__init__(parent)
        self.setupUi(self)

#----------------------------------------------------------------------
def perforceBrowser2():
    perforceBrowserWnd = PerforceWindow()
    perforceBrowserWnd.show()

perforceBrowser2()

每次运行perforceBrowser2()函数时都会有一个新的windows副本。

如何查找窗口是否已经运行而不是打开它的新副本,然后转到打开的窗口?或者只是不给脚本运行第二个窗口副本?

PS。 maya2014 + pyqt4 + python2.7

2 个答案:

答案 0 :(得分:2)

保持对窗口的全局引用:

perforceBrowserWnd = None

def perforceBrowser2():
    global perforceBrowserWnd
    if perforceBrowserWnd is None:
        perforceBrowserWnd = PerforceWindow()
    perforceBrowserWnd.show()

答案 1 :(得分:0)

使用全球不是首选的方式,并且有大量的文章为什么这是一个坏主意。

  

Why are global variables evil?   记住类的静态var中的实例以及加载UI时更清楚,检查它是否已经存在并返回它,如果没有创建它。 (有一种称为Singleton的模式也描述了这种行为)

import sys

from Qt import QtGui, QtWidgets, QtCore

class Foo(QtWidgets.QDialog):
    instance = None
    def __init__(self, parent=None):
        super(Foo, self).__init__(parent)
        self.setWindowTitle('Test')

def loadUI():
    if not Foo.instance:
        Foo.instance = Foo()
    Foo.instance.show()
    Foo.instance.raise_()

loadUI()

无论何时调用loadUI,它都将返回相同的UI,并且不会在每次调用时重新创建。