Qt invokeMethod и вызов статического метода? - PullRequest
0 голосов
/ 18 февраля 2019

Можно ли вызвать статический метод?

Я использую:

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 голосов
/ 18 февраля 2019

Зачем ты это делаешь?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();
  }
};
0 голосов
/ 18 февраля 2019

да, вы можете, но метод должен быть аннотирован как invocable т.е. Q_INVOKABLE см. что задокументировано об этом ...

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:
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...