Maya (PySide2) - 重新打开窗口而不是新窗口

Posted

技术标签:

【中文标题】Maya (PySide2) - 重新打开窗口而不是新窗口【英文标题】:Maya (PySide2) – Reopen window instead of a new window 【发布时间】:2020-07-05 11:53:36 【问题描述】:

我遇到的问题是每次按下热键(在本例中为 CTRL + A)我都会打开一个新窗口,而旧窗口并没有消失。

我在代码中添加了随机颜色和随机位置,以便您使用新窗口。 在 Maya 中使用脚本:

from PySide2 import QtWidgets, QtCore, QtGui
from PySide2.QtGui import QKeySequence
from PySide2.QtWidgets import QShortcut
from maya import OpenMayaUI
import sys
from random import randrange

try:
    from shiboken import wrapInstance
    import shiboken
except:
    from shiboken2 import wrapInstance
    import shiboken2 as shiboken

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent = None):
        window = OpenMayaUI.MQtUtil.mainWindow()
        mayaWindow = shiboken.wrapInstance(long(window), QtWidgets.QMainWindow)
        super(MainWindow, self).__init__(mayaWindow)

        self.setWindowTitle('Test Window')

        #Set a random color:
        self.setStyleSheet('background-color: rgb(' + str(randrange(255)) + ', ' + str(randrange(255)) + ', ' + str(randrange(255)) + ');')

        self.setWindowFlags(QtCore.Qt.Popup | QtCore.Qt.WindowType.NoDropShadowWindowHint)
        self.resize(630, 400)
        self.releaseKeyboard()
        self.releaseMouse()
        self._window = None

        #Set a random position:
        self.setGeometry(randrange(800), randrange(800), randrange(800), randrange(800))

        # main widget
        mainWidget = QtWidgets.QWidget(self)
        self.setCentralWidget(mainWidget)


    def mousePressEvent(self, QMouseEvent):
        closeOnLostFocus = True

        if closeOnLostFocus:
            xPosition = QMouseEvent.pos().x()
            yPosition = QMouseEvent.pos().y()
            width = self.width()
            height = self.height()
            if xPosition > self.width() or xPosition < 0:
                self.closeWindow()
            if yPosition > self.height() or yPosition < 0:
                self.closeWindow()


    def showWindow(self):
        self.closeWindow()
        if self._window is None:
            self._window = MainWindow()
            self._window.show()


    def closeWindow(self):
        self.close()


def setHotkey(*args):
    hotkey = ''

    window = window = OpenMayaUI.MQtUtil.mainWindow()
    mayaWindow = shiboken.wrapInstance(long(window), QtWidgets.QMainWindow)
    hotkey = 'CTRL + A'
    shortcut = QShortcut(QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_A), mayaWindow)
    shortcut.setContext(QtCore.Qt.ApplicationShortcut)
    shortcut.activated.connect(startApp)
    return hotkey


def startApp(*args):
    app = QtWidgets.QApplication.instance()
    if app is None:
        app = QtWidgets.QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.showWindow()

setHotkey()

我希望出现一个新窗口,而之前创建的窗口消失,这样一次只存在一个。

【问题讨论】:

【参考方案1】:

你必须有一个变量来存储唯一的对象,这就是我创建一个全局变量的原因:

mainWindow = None

def startApp(*args):
    app = QtWidgets.QApplication.instance()
    if app is None:
        app = QtWidgets.QApplication(sys.argv)
    global mainWindow
    mainWindow = MainWindow()
    mainWindow.show()

setHotkey()

【讨论】:

使用我在上面发布的代码,通过您的更改,我仍然可以同时创建任意数量的窗口,我错过了什么吗? 我删除了 showWindow 功能,但它仍然不起作用 @Lala_Ghost 我经常使用相同的方法在全局变量上创建一个实例,使其只有一个窗口。你是如何运行你的脚本的?直接通过脚本编辑器还是导入模块? 在 scruot 编辑器中运行脚本并导入它具有相同的效果,它可以正常加载并且可以正常工作,但是我一次可以创建多个窗口

以上是关于Maya (PySide2) - 重新打开窗口而不是新窗口的主要内容,如果未能解决你的问题,请参考以下文章

使用 PySide2 开发 Maya 插件系列二:继承 uic 转换出来的 py 文件中的类 Ui_Form

maya 独立与 pyside2

在场景中执行修改并从 Maya 中的 QThread 更新自定义窗口

Maya PySide2 UI 获取 QLineEdit 值

使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization)

Maya Pyside2 UI,无法让 QPushButton 与同一类中的函数连接