1

我有多个 ui 文件,每个文件都是在 Qt Designer 中创建的。我有一个调用第一个 UI 的函数(main)。第一个 UI 上有一个按钮,它调用第二个 UI 并关闭第一个。

from PyQt4 import QtGui,QtCore, uic

uifile_1 = '/Users/Shared/Autodesk/maya/scripts/python/Intro_UI.ui'
form_1, base_1 = uic.loadUiType(uifile_1)

uifile_2 = '/Users/Shared/Autodesk/maya/scripts/python/objtemplate_tuner.ui'
form_2, base_2 = uic.loadUiType(uifile_2)

class CreateUI_2(base_2, form_2):
    def __init__(self):
        super(base_2,self).__init__()
        self.setupUi(self)

class CreateUI_1(base_1, form_1):
    def __init__(self):
        super(base_1,self).__init__()
        self.setupUi(self)
        self.Establish_Connections()

    def Do_ButtonPress(self):        
        UI_2=CreateUI_2()
        UI_2.show()
        self.close()
    def Establish_Connections(self):
        QtCore.QObject.connect(self.noncharactermeshes_Button, QtCore.SIGNAL("clicked()"),self.Do_ButtonPress)      

def main():       
    UI_1 = CreateUI_1()
    UI_1.show()

main()

问题是当我运行 main() 时没有任何反应。另请注意,我正在为 Maya 创建此脚本并使用 PyQt4。

4

2 回答 2

1

我找到了答案,原来我需要为我的 ui 使用全局变量。

    def Do_ButtonPress(self):
        global UI_2
        UI_2=CreateUI_2()
        UI_2.show()

...

def main():
    global UI_1
    UI_1 = CreateUI_1()
    UI_1.show()
于 2012-09-05T15:50:56.850 回答
0

根据您的 Maya 版本,Qt 可能已经或可能尚未作为应用程序运行。

Autodesk 几年前开始将 Qt 引入他们的软件,而最新的 Maya 几乎完全由 Qt 驱动。

从您可以运行代码而不会崩溃的事实来看,我假设 QApplication 已经存在于引擎盖下的某个地方。重要的是要注意,如果不首先创建 QApplication,就不能创建任何 QtGui 组件(嗯,QPaintDevice 的 - 所以 QWidget、QDialog、QMainWindow 等),否则会崩溃。

您没有看到任何内容的事实意味着您处于使用 Qt(并初始化 QApplication)但未运行其事件循环的 Maya 版本中 - 或者存在育儿问题。

我首先将您的主要功能切换为如下所示:

def main():
    app = None
    # there needs to be 1 and only 1 application instance
    if ( not QtGui.QApplication.instance() ):
        app = QtGui.QApplication([])

    UI_1 = CreateUI_1()
    UI_1.show()

    # see if you can parent to a window (maya)
    UI_1.setParent(QtGui.QApplication.activeWindow())

如果这不起作用,那么您将需要在 Maya 的事件循环中更新 Qt 事件循环。我不记得它的语法......但最终你将需要使用 Maya 的回调系统来更新 Qt 事件:

    QtGui.QApplication.instance().processEvents()
于 2012-09-05T00:05:11.920 回答