Qt invokeMethod 和调用静态方法?
Qt invokeMethod and calling a static method?
是否可以调用静态方法?
我正在使用:
QMetaObject::invokeMethod(this
,strThread.toLatin1()
,Qt::DirectionConnection
,Q_ARG(clsThread*, this));
这行得通,但是我想调用静态方法,但行不通,是否可以调用静态方法?
我试过分配给 strThread:“clsScriptHelper::threadFun"
,但这不起作用。
我无法使用静态方法,因此我实施了替代解决方案。在我的派生线程 class 中,我添加了一个类型为:
的成员
QObject* mpobjClass;
然后我添加了一个方法来设置这个:
void setClassPtr(QObject* pobjClass) { mpobjClass = pobjClass; }
我的调用现在看起来像这样:
QMetaObject::invokeMethod(mpobjClass
,strThread.toLatin1()
,Qt::DirectConnection
,Q_ARG(clsThread*, this));
这对我有用。
是的,你可以,但方法必须注释为 invocable 即 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:
};
你为什么要这么做? 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();
}
};
是否可以调用静态方法?
我正在使用:
QMetaObject::invokeMethod(this
,strThread.toLatin1()
,Qt::DirectionConnection
,Q_ARG(clsThread*, this));
这行得通,但是我想调用静态方法,但行不通,是否可以调用静态方法?
我试过分配给 strThread:“clsScriptHelper::threadFun"
,但这不起作用。
我无法使用静态方法,因此我实施了替代解决方案。在我的派生线程 class 中,我添加了一个类型为:
的成员QObject* mpobjClass;
然后我添加了一个方法来设置这个:
void setClassPtr(QObject* pobjClass) { mpobjClass = pobjClass; }
我的调用现在看起来像这样:
QMetaObject::invokeMethod(mpobjClass
,strThread.toLatin1()
,Qt::DirectConnection
,Q_ARG(clsThread*, this));
这对我有用。
是的,你可以,但方法必须注释为 invocable 即 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:
};
你为什么要这么做? 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();
}
};