1

QMetaObject::invokeMethod の使用法を理解しようとしています。私は1つの引数(非const QString)を持つ関数を持っています。それを出力にしたいのですが、関数には戻り値がなく、invokeMethodの呼び出しは常に失敗しますが、戻り値があり引数がない別の関数を呼び出すことはできません成功しました。コードは次のとおりです。

myclass.h

#include <QDebug>

class MyClass: public QObject
{
    Q_OBJECT
public:
    MyClass() {}
    ~MyClass() {}
public slots:
    QString func();
    void func2(QString& res);
};

myclass.cpp

#include "myclass.h"

QString MyClass::func()
{
    QString res = "func succeeded";
    qDebug() << res;
    return res;
}

void MyClass::func2(QString& res)
{
    res = "func2 succeeded";
    qDebug() << res;
    return;
}

main.cpp

#include <QCoreApplication>
#include "myclass.h"

int main(int argc, char *argv[])
{
    QString msg;
    MyClass myobj;

    QCoreApplication a(argc, argv);

    bool val = QMetaObject::invokeMethod(&myobj, "func", Q_RETURN_ARG(QString, msg));
    qDebug() << "func returns" << val;

    val = QMetaObject::invokeMethod(&myobj, "func2", Q_RETURN_ARG(QString, msg));
    qDebug() << "func2 returns" << val;

    int ret = a.exec();
    return ret;
}

結果は次のとおりです。

$ ./test
"func succeeded"
func returns true
QMetaObject::invokeMethod: No such method MyClass::func2()
Candidates are:
    func2(QString&)
func2 returns false

いろいろ試したのですが、うまくいきません 原因わかる方いますか?前もって感謝します!

4

2 に答える 2

1

Q_RETURN_ARGを使用する場合はメソッドが返す値を取得しますが、引数を渡したい場合はQ_ARGを使用する必要があります:

#include <QCoreApplication>
#include "myclass.h"

int main(int argc, char *argv[])
{
    QString msg;
    MyClass myobj;

    QCoreApplication a(argc, argv);

    bool val = QMetaObject::invokeMethod(&myobj, "func", Q_RETURN_ARG(QString, msg));
    qDebug() << "func returns" << val;

    val = QMetaObject::invokeMethod(&myobj, "func2", Q_ARG(QString &, msg));
    qDebug() << "func2 returns" << val;

    int ret = a.exec();
    return ret;
}

出力:

"func succeeded"
func returns true
"func2 succeeded"
func2 returns true
于 2018-02-24T04:35:57.093 に答える
1

エラーメッセージはそれをすべて言います。クラスには署名付きのメソッドがありませんMyClass:func2()

関数が signature: を持つように宣言しましたがvoid func2(QString&)、これは と同じではありませんQString& func2()関数のパラメーターを戻り値として使用しているという事実は、Qt シグナルとスロットがメソッドに名前を付けたり、それらを検索したりする方法とは何の関係もありません。実際、呼び出しシグネチャとはまったく関係がありません。呼び出し署名はそれが何であれ、Qt はパラメーターの使用方法を推測できません。

最も簡単な修正方法は、メソッドの呼び出し方法を変更することです。あなたが持っている必要があります

QMetaObject::invokeMethod(&myobj, "func2", Q_ARG(QString, msg));

または、さらに良いことに、Qt 5.0+ タイプセーフなシグナルとスロットを使用します。

QMetaObject::invokeMethod(&myobj, &MyClass::func2, &msg);
于 2018-02-24T04:36:13.833 に答える