QT Gui 窗口在 Maya 中出现然后消失

Posted

技术标签:

【中文标题】QT Gui 窗口在 Maya 中出现然后消失【英文标题】:QT Gui Window appears then disappears in Maya 【发布时间】:2015-10-21 22:20:32 【问题描述】:

这里有两个问题。我不明白如何让我的 GUI 代码作为 Maya 架子按钮工作,而不是在脚本编辑器中运行。我的第一个问题是是否有任何简单的方法可以在 if --main-- 部分中调用我的代码?现在我不得不将我在那里的几行代码放入它自己的函数中并以这种方式调用。这是我所拥有的:

from PySide import QtCore, QtGui, QtUiTools
import maya.cmds as cmds

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(400, 300)

        GUI STUFF HERE


    def retranslateUi(self, Dialog):
        SET TEXT STUFF

    def closeBtn_clicked(self):
        DO SOMETHING

    def swapRefBtn_clicked(self):
        DO SOMETHING


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication.instance()
    if app is None:
        app = QtGui.QApplication(sys.argv)       
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    app.exec_()

我这样做是作为搁板按钮,这显然是行不通的(无论如何可以访问 if "--main--" 中的 sn-p 吗?):

import swapRef as swap
swap.main()

我发现的唯一解决方法是将所有这些都放入它自己的函数中,然后调用它:

def main():
    import sys
    app = QtGui.QApplication.instance()
    if app is None:
        app = QtGui.QApplication(sys.argv)       
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    app.exec_()

但是...问题 #2 当我进行此更改时,我的 GUI 窗口现在弹开并迅速消失/消失。我不确定为什么将这段代码放入函数中并调用它会导致这种变化?请帮忙,我一直坐在这个上面不知道为什么。

【问题讨论】:

补充一点,我已经做了一些研究,app.exec() 应该保持窗口。为什么当我将 if main 部分移动到它自己的函数中并在那里调用它时它不保持它,而不是当它保持原样时它运行良好? 【参考方案1】:

如果 Maya 创建了 QApplication 的实例,我认为您不需要调用 app.exec_()。我怀疑在这种情况下该调用可能没有任何作用,这就是您的函数返回的原因(这很好,否则它会阻塞 Maya 的其余部分)。

您的对话框消失的问题是因为您没有保存对Dialog 变量的引用,因此当main 函数完成时它会被垃圾收集。您应该从您的函数中返回 Dialog 并将其存储在永久位置以防止垃圾收集。我怀疑做dialog = swap.main() 就足够了(不要忘记添加return Dialog 行)

【讨论】:

谢谢!这种说法很有道理。我没有返回对话框窗口。您确定不需要 app.exec 吗?没有它它确实可以工作,我想我不明白这一点,因为我认为这是保持交互窗口的原因。 @sz200 我认为玛雅会自己调用app.exec_()。它没有理由创建QApplication 的实例但不调用app.exec_()

以上是关于QT Gui 窗口在 Maya 中出现然后消失的主要内容,如果未能解决你的问题,请参考以下文章

如何将qt designer中dialog的边框消失

Dos窗口出现然后立即消失

Qt动画窗口,Qt之对话框消失动画

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

Qt之界面出现消失动画效果(简单好用)

调整窗口大小时位图消失