有没有人试图在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 <

最佳答案

QMetaObject::invokeMethoddocs中所述:


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


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


这应该足够了,尽管我以前从未见过在运算符上使用过invokeMethod

编辑

moc似乎无法将运算符注册到元对象系统中,从而调用:

qDebug() << worker.metaObject()->indexOfMethod( "operator<<" );


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

08-07 04:43