You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Maya中基于OpenMaya API实现Qt信号与槽?

问题:Maya OpenMaya API中Qt信号槽功能无法正常工作

我正在学习Qt信号与槽,尝试在Maya的OpenMaya API中实现该功能,但一直没成功。我的需求是点击convert按钮时,把melPTextEdit里的文本内容同步到pyPTextEdit中,想要复现我用PySide2写的类似功能。

以下是我编写的代码(经过重写,可能存在不一致):

serpensCmd.h

#ifndef _serpensCmd
#define _serpensCmd
#define slots Q_SLOTS

#include <stdio.h>

#include <maya/MPxCommand.h>
#include <maya/MArgList.h>
#include <maya/MQtUtil.h>

#include <QtWidgets/QLabel>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QSpinBox>
#include <QtCore/QObject>
#include <QtCore/QString>

#include <QtWidgets/QMainWindow>
#include <QtWidgets/QWidget>
#include <QtCore/Qt>
#include <QtWidgets/QTextEdit>
#include <QtCore/QPointer>
#include <QtWidgets/QWidget>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QSpinBox>
#include <QtCore/QObject>
#include <QtCore/QString>



class SerpensMainWindow : public QMainWindow {
    Q_OBJECT
public:
    SerpensMainWindow(
        QWidget* parent = MQtUtil::mainWindow(),
        Qt::WindowFlags flags = Qt::WindowFlags()
    );
    virtual ~SerpensMainWindow();

    QGridLayout* gridLayout;
    QWidget* cw;
    QLabel* melLabel;
    QLabel* pyLabel;
    QTextEdit* melPTextEdit;
    QTextEdit* pyPTextEdit;
    QPushButton* convertButton;
    QPushButton* debugButton;

public slots:
    void debug();
    void convert();
};


class serpens : public MPxCommand
{

public:
    serpens();
    virtual ~serpens();


    static void cleanup();
    static void createWindow();
    static void* creator() { return new serpens(); }

    MStatus doIt(const MArgList&);

    static QPointer<SerpensMainWindow> window;
    static const MString commandName;

private:
};

#endif

serpensCmd.cpp

#include "serpensCmd.h"
#include <maya/MGlobal.h>

SerpensMainWindow::SerpensMainWindow(QWidget* parent, Qt::WindowFlags flags)
    : QMainWindow(parent, flags)
{

    QGridLayout* gridLayout = new QGridLayout(this);
    QWidget* cw = new QWidget(this);
    cw->setLayout(gridLayout);
    setCentralWidget(cw);


    QLabel* melLabel = new QLabel("mel", centralWidget());
    QTextEdit* melPTextEdit = new QTextEdit(centralWidget());

    QLabel* pyLabel = new QLabel("python", centralWidget());
    QTextEdit* pyPTextEdit = new QTextEdit(centralWidget());

    QPushButton* convertButton = new QPushButton("convert", centralWidget());
    QPushButton* debugButton = new QPushButton("debug", centralWidget());

    gridLayout->addWidget(melLabel, 0, 0, 1, 1);
    gridLayout->addWidget(melPTextEdit, 1, 0, 1, 1);
    gridLayout->addWidget(pyLabel, 0, 1, 1, 1);
    gridLayout->addWidget(pyPTextEdit, 1, 1, 1, 1);
    gridLayout->addWidget(convertButton, 2, 0, 1, 2);
    gridLayout->addWidget(debugButton, 3, 0, 1, 2);

    debugButton->connect(
        debugButton, SIGNAL(clicked()),
        this, SLOT(debug())
    );

    convertButton->connect(
        convertButton, SIGNAL(clicked()),
        this, SLOT(convert())
    );

    setWindowTitle("Serpens");

}

SerpensMainWindow::~SerpensMainWindow() {}


QPointer<SerpensMainWindow> serpens::window;

const MString serpens::commandName("Serpens");


void serpens::cleanup()
{
    if (!window.isNull()) delete window;
}


void serpens::createWindow() {
    if (window.isNull()) {
        window = new SerpensMainWindow();
        window->show();
    }
    else {
        window->showNormal();
        window->raise();
    }
}




void SerpensMainWindow::convert() {
    pyPTextEdit->setText(melPTextEdit->toPlainText());
    MGlobal::displayInfo(
        MQtUtil::toMString(pyPTextEdit->toPlainText())
    );
}


void SerpensMainWindow::debug() {
    MGlobal::displayInfo(MString("debug = "));
}


MStatus serpens::doIt( const MArgList& )
{
    MStatus stat = MS::kSuccess;

    serpens::createWindow();

    return redoIt();
}



serpens::serpens()
{}

serpens::~serpens()
{
}

pluginMain.cpp

#include "serpensCmd.h"

#include <maya/MFnPlugin.h>

MStatus initializePlugin( MObject obj )
{
    MStatus   status;
    MFnPlugin plugin( obj, "test", "2019", "Any");
    status = plugin.registerCommand("serpens", serpens::creator);
    if (!status) {
        status.perror(
            MString("SerpensCmd - could not initialize plugin: ")
            + status.errorString()
        );
        return status;
    }

    return status;
}

MStatus uninitializePlugin( MObject obj )
{
    MStatus   status;
    MFnPlugin plugin( obj );

    serpens::cleanup();
    status = plugin.deregisterCommand( "serpens" );
    if (!status) {
        status.perror(
            MString("SerpensCmd - could not register '")
            + serpens::commandName + "' command: "
            + status.errorString()
        );
        return status;
    }

    return status;
}

PySide2示例代码(可正常工作)

from PySide2.QtWidgets import *
 
class window(QMainWindow):
    def __init__(self, parent=None):
        super(window, self).__init__(parent)
        gridLayout = QGridLayout(self);
        cw = QWidget(self);
        cw.setLayout(gridLayout);
        self.setCentralWidget(cw);

        self.PTextEditA = QTextEdit(self.centralWidget());
        self.PTextEditB = QTextEdit(self.centralWidget());
        self.button = QPushButton("ok", self.centralWidget());
    
        gridLayout.addWidget(self.PTextEditA, 0, 0, 1, 1);
        gridLayout.addWidget(self.PTextEditB, 1, 0, 1, 1);
        gridLayout.addWidget(self.button, 2, 0, 1, 2);
        self.button.clicked.connect(self.testA)
    
    def testA(self):
        self.PTextEditB.setText(self.PTextEditA.text())
    

def main():
    app = QApplication.instance()
    mainWin = window()
    mainWin.show()
    sys.exit()
    app.exec_()
main()

我还尝试了Qt5的新式连接语法,但同样无法生效:

debugButton->connect(
    debugButton, &QPushButton::clicked,
    this, &SerpensMainWindow::convert
);

内容的提问来源于stack exchange,提问作者user7340833

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:54:17