1

Qt Designer で作成された複数の ui ファイルがあります。最初の UI を呼び出す関数 (メイン) があります。この最初の UI には、2 番目の 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 に答える