【问题标题】:Maya + PyQt dialog. How to run a single copy of Qt window?Maya + PyQt 对话框。如何运行 Qt 窗口的单个副本?
【发布时间】:2017-11-23 07:44:23
【问题描述】:

使用这个简单的代码来运行一个基于 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

【问题讨论】:

    标签: python-2.7 pyqt pyqt4 maya


    【解决方案1】:

    保持对窗口的全局引用:

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

    【讨论】:

      【解决方案2】:

      使用全局不是首选方式,有大量文章说明这是一个坏主意。

      Why are global variables evil? 在类的静态变量中记住实例会更清晰,并且每当您加载 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,并且不会在您每次调用时重新创建。

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多