0

我有一个基类 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: error: no matching function for call to 'BindedSettings::connect(BindedSettings*, QMetaMethod&, BindedSettings*, BindedSettings::bindWtToProp(QLineEdit*, const char*)::) ' 连接(这个,信号,这个,={});

4

1 回答 1

3

您正在混合 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()没有同时接受 aQMetaMethod和 a 的重载Functor

5 年前在Qt 论坛上已经提出了同样的问题,答案是:

与仿函数/lambda 的连接使用函数指针。它们需要在编译时解析,因为编译器需要知道您正在使用什么类型的函数指针。您不能使用运行时字符串。

我相信情况没有改变。

于 2018-12-07T16:16:58.787 回答