невозможно соединить QMetaMethod с лямбдой - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть настройки базового класса 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;
}

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

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

1 Ответ

0 голосов
/ 07 декабря 2018

Вы смешиваете 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 forum , ответ был:

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

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

...