Нет соответствующей функции для вызова-компилятор говорит, что я вызываю (QObject *&), когда вызов (QObject *)


Это код:

void invokeQMLFunction2Arg(QObject * object, QString func, QVariant p1, QVariant p2) {
    QMetaObject::invokeMethod(object, func, Qt::DirectConnection, Q_ARG(QVariant, p1), Q_ARG(QVariant, p2));
}

Это ошибка:

error: no matching function for call to 'QMetaObject::invokeMethod(QObject*&, QString&, Qt::ConnectionType, QArgument<QVariant>, QArgument<QVariant>)'

Что я упускаю? Я вызываю invokeMethod() с указателем, но компилятор жалуется, что это ссылка на указатель.

2 2

2 ответа:

Вы пытаетесь передать QString второму аргументу, тогда как это должно быть const char*. Преобразуйте его в правильный тип, поскольку неявного преобразования не существует. Сначала вам нужно решить, каким образом преобразовать его в QByteArray, поэтому это один из примеров, который вы потенциально можете написать:

QMetaObject::invokeMethod(object, func.toUtf8().constData(), Qt::DirectConnection, Q_ARG(QVariant, p1), Q_ARG(QVariant, p2));

Я уже сталкивался с тем же вопросом. и моя проблема на самом деле вызвана другими факторами. Я перемещаю одну из моих программ с QT 4 на QT 5, и я не объявлял QDialog явно, поэтому, когда я вызываю метод, возникает ошибка:

error: no matching function for call to 'QMetaObject::invokeMethod(QDialog*&, const char [12],     Qt::ConnectionType)'

И я вижу результат компиляции, сообщение об ошибке,

note:   no known conversion for argument 1 from 'QDialog*' to 'QObject*'
Внезапно я понял, что не объявляю Qdialog. QT иногда не может дать действительно хороший результат ошибки компиляции, я думаю.