2015-03-24 4 views
1

Кто-нибудь пытался вызвать перегруженного оператора < < на QObject.QMetaObject вызывать на перегруженные операторы

Например у меня есть класс

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 :: Оператор < < (символ) (символ)

ответ

0

Как отмечено в docs для QMetaObject::invokeMethod в:

You only need to pass the name of the signal or slot to this function, not the entire signature.

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

Этого должно быть достаточно, хотя я никогда не видел invokeMethod используется на оператора раньше.

Редактировать

Оказывается, что moc не может зарегистрировать операторов в системе метаобъектной, вызывая:

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

Вернется -1. Лучше всего поместить ваш operator<< в базовый класс, сделать его не виртуальным и вызвать новый виртуальный метод или слот Q_INVOKABLE. Производные классы затем переопределяют новый метод, который также может быть вызван через систему метаобъектов.

+0

Вы были о названии функции. Обычные функции называются так. Я попробовал ваше предложение и все еще не работает: QMetaObject :: invokeMethod: Нет такого метода Worker :: operator << (char) – GeneralFailure

+0

«Вы были о имени функции, так называемые обычные функции». Какие? Вы можете напрямую вызвать операторов, поэтому '(& worker) -> operator << ('a')' является законным. Вы спрашивали о перегруженных операторах, какие другие перегрузки? (Добавьте их к своему вопросу). – cmannett85

+0

Ах, извините, плохой английский. Я имел в виду, что вы были правы, и это обычно работает для обычных функций. Однако, когда вы пытаетесь использовать перегруженные операторы, он не находит этот метод. Возможно, это имеет какое-то отношение к moc и << персонажам в подписи, но это не работает для меня. Вы можете попробовать это, если хотите, и если это сработает и убедитесь сами. – GeneralFailure

Смежные вопросы