Massimo
Massimo

Reputation: 966

Maya + PyQt dialog. How to run a single copy of Qt window?

use this simple code for run a window based on 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()

every time you run the function perforceBrowser2() there is a new copy of windows.

how to find whether a window is already running and not to open a new copy of it, and go to the opened window? or just do not give a script to run a second copy of window?

ps. maya2014 + pyqt4 + python2.7

Upvotes: 1

Views: 1844

Answers (2)

user1767754
user1767754

Reputation: 25094

Using global's are not the preferred way and there are ton's of articles why it is a bad idea.

Why are global variables evil? It is cleaner to remember the instance in a static var of the class and whenever you load the UI, check if it does already exist and return it, if not create it. (There is a pattern called Singleton that describes this behaviour as well)

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()

Whenever you call loadUI it will return the same UI and will not recreate each time you call it.

Upvotes: 1

ekhumoro
ekhumoro

Reputation: 120568

Keep a global reference to the window:

perforceBrowserWnd = None

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

Upvotes: 2

Related Questions