如何在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
相关产品推荐
相关产品推荐

