Невозможно соединить QMetaMethod с лямбдой

У меня есть настройки базового класса Binded для привязки свойства в нем с заданными виджетами, как, например, LineEdit. Я застрял с подключением сигналов и слот. Как я вижу, это так же, как предоставленный код в ответе Как использовать QMetaMethod с QObject:: connect ^

class BindedSettings: public QObject
{
    Q_OBJECT
public:
bool bindWtToProp(QLineEdit* targetWt, const char* propertyName);
bool stringFromVariant(const QVariant& val, QString& result){...}
}

в cpp:

bool BindedSettings::bindWtToProp(QLineEdit *targetWt, const char *propertyName)
{
    QLineEdit* le = targetWt;
    QMetaProperty mp = metaObject()->property(metaObject()->indexOfProperty(propertyName));

    //connecting property notifiedSignal with reader lambda
    QMetaMethod signal = mp.notifySignal();
    connect(this, signal, this, [=](){
    }); //reader
    return true;
}

У меня есть некоторые классические соединения (без qmetamethod) в той же функции, но вот что я получаю

C:\Projects\some\settings.cpp:279: ошибка: нет соответствующей функции для вызова 'BindedSettings::connect(BindedSettings*, QMetaMethod&, BindedSettings*, BindedSettings::bindWtToProp(QLineEdit*, const char*)::)' connect(this, signal, this, ={});

1 ответ

Решение

Вы смешиваете 2 определения QObject::connect():

  1. QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
  2. QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)

Но connect() не имеет перегрузки, которая занимает как QMetaMethod и Functor,

Точно такой же вопрос уже задавался 5 лет назад на форуме Qt, ответ был:

Соединения с функторами / лямбдами используют указатели функций. Они должны быть разрешены во время компиляции, потому что компилятор должен знать, какие типы указателей на функции вы используете. Вы не можете использовать строки времени выполнения.

Я считаю, что ситуация не изменилась.

Другие вопросы по тегам