【问题标题】:QMetaObject invoke on overloaded operatorsQMetaObject 在重载运算符上调用
【发布时间】:2015-05-28 08:37:39
【问题描述】:

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

【问题讨论】:

    标签: c++ qt qmetaobject


    【解决方案1】:

    docs 中的QMetaObject::invokeMethod 所述:

    你只需要将信号或槽的名称传递给这个函数, 不是整个签名。

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

    这应该足够了,虽然我以前从未见过invokeMethod 用于运算符。

    编辑

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

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

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

    【讨论】:

    • 你是关于函数的名称。普通函数就是这样调用的。我尝试了您的建议,但仍然无效: QMetaObject::invokeMethod: No such method Worker::operator
    • "你说的是函数的名字。普通函数就是这样调用的。"什么?您可以直接致电运营商,因此(&amp;worker)-&gt;operator&lt;&lt;( 'a' ) 是合法的。您问过重载运算符,其他重载是什么? (将它们添加到您的问题中)。
    • 对不起,英语不好。我的意思是你是对的,这通常适用于普通功能。但是,当您使用重载运算符尝试它时,它找不到该方法。也许它与签名中的 moc 和
    • @GeneralFailure 你是对的!我添加了更多信息。
    • 好的,我会接受这个策略。但是我不确定如果在基本运算符
    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多