Qt invokeMethod和调用静态方法?

时间:2019-02-18 11:50:56

标签: c++ qt invoke

是否可以调用静态方法?

我正在使用:

QMetaObject::invokeMethod(this
                         ,strThread.toLatin1()
                         ,Qt::DirectionConnection
                         ,Q_ARG(clsThread*, this));

这行得通,但是我想调用一个静态方法,但不行,是否可以调用一个静态方法?

我尝试分配给strThread:“ clsScriptHelper::threadFun",但这不起作用。

我无法使用静态方法,因此我实现了替代解决方案。在派生的线程类中,我添加了一个类型为

的成员。
QObject* mpobjClass;

然后我添加了一种设置方法:

void setClassPtr(QObject * pobjClass){mpobjClass = pobjClass; }

我的调用现在看起来像这样:

QMetaObject::invokeMethod(mpobjClass
                         ,strThread.toLatin1()
                         ,Qt::DirectConnection
                         ,Q_ARG(clsThread*, this));

这对我有用。

2 个答案:

答案 0 :(得分:2)

是的,可以,但是该方法必须以 可调用 的方式注释,即Q_INVOKABLE参见what qt documented about it...

Foo obj;
QMetaObject::invokeMethod(&obj, "amSomething", Qt::DirectConnection);

Foo应该看起来像:

class Foo : public QObject
{
    Q_OBJECT
public:
    explicit Foo(QObject *parent = nullptr);
    Q_INVOKABLE static  void amSomething(){ qDebug() << "am in static";}
signals:

public slots:
};

答案 1 :(得分:0)

您为什么要这么做? invokeMethod用于当对象具有动态类型并且您有一个实例并且想要对该实例调用方法,尽管对该类型一无所知。

您似乎想要做的是基于字符串名称调度静态方法。这并不难,不需要invokeMethod

class Class {
public:
  static void method1();
  static void method2();
  static void dispatchByName(const char *name) {
    if (QByteArrayLiteral("method1") == name) method1();
    else if (QByteArrayLiteral("method2") == name) method2();
  }
};