QMetaObject在重载的运算符上调用

时间:2015-03-24 20:56:07

标签: c++ qt qmetaobject

是否有人试图调用重载运算符<<在QObject上。

例如我有一个班级

class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = 0);

    Q_INVOKABLE virtual void operator<<(char p);

};

当我尝试用这样的方式调用它时,我得到一个错误:

QMetaObject::invokeMethod( &worker, QT_STRINGIFY2( operator<<(char) ), Qt::QueuedConnection, Q_ARG( char, 'a') );

ErrorMessage将是:没有这样的方法Worker :: operator&lt;&lt;(char)(char)

1 个答案:

答案 0 :(得分:0)

正如QMetaObject::invokeMethod QMetaObject::invokeMethod( &worker, "operator<<", Qt::QueuedConnection, Q_ARG( char, 'a') ); 中所述:

  

您只需要将信号或插槽的名称传递给此功能,   不是整个签名。

invokeMethod

这应该足够了,尽管我之前从未见过moc运算符。

修改

qDebug() << worker.metaObject()->indexOfMethod( "operator<<" ); 似乎无法将运算符注册到元对象系统中,调用:

-1

将返回operator<<。最好的办法是将Q_INVOKABLE放在基类中,使其成为非虚拟的,并让它调用新的虚拟{{1}}方法或插槽。然后,派生类将重新实现新方法,该方法也可以通过元对象系统调用。