有没有人试图在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::invokeMethod
的docs中所述:
您只需要将信号或插槽的名称传递给此功能,
不是整个签名。
QMetaObject::invokeMethod( &worker,
"operator<<",
Qt::QueuedConnection,
Q_ARG( char, 'a') );
这应该足够了,尽管我以前从未见过在运算符上使用过
invokeMethod
。编辑
moc
似乎无法将运算符注册到元对象系统中,从而调用:qDebug() << worker.metaObject()->indexOfMethod( "operator<<" );
将返回
-1
。最好的办法是将您的operator<<
放在基类中,使其变为非虚拟的,并使其调用新的虚拟Q_INVOKABLE
方法或插槽。然后派生的类将重新实现新方法,该方法也可以通过元对象系统调用。