LINUX.ORG.RU

QDataStream перегрузка оператора << и >> для класса QObject*

 ,


0

2

Здравствуйте, есть примерный код:

#include <QCoreApplication>
#include <qobject.h>
#include <qmetatype.h>
#include <qdatastream.h>
#include <qvariant.h>

QDataStream &operator <<(QDataStream &out, const QObject *object)
{
    Q_UNUSED(object);
    return out;
}
QDataStream &operator >>(QDataStream &in, QObject *object)
{
    Q_UNUSED(object);
    return in;
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // регестрируем
    qRegisterMetaTypeStreamOperators<QObject*>();

    QDataStream stream;
    QObject* ob = new QObject();

    QVariant var;
    var.setValue(ob);
    var.save(stream);       // при отладке должные попасть в  перегрузку '<<', но не попадаем

    return 0;
}

Делаем перегрузку, регестрируем, радуемся отсутствию ошибок, но при отладке в перегруженные функции не попадаем.

Хотя, если заменить QObject, в следующих строках на имя любого своего класса, все работает как надо (то есть, код - рабочий):

  • QDataStream &operator <<(QDataStream &out, const QObject *object)
  • QDataStream &operator >>(QDataStream &in, QObject *object)
  • qRegisterMetaTypeStreamOperators<QObject*>();

Подозреваю, что загвоздка в перегрузке операторов именно под класс QObject - как можно исхитрится, чтобы это дело обойти и все заработало?
Не использовать таким образом класс QObject не могу, очень надо, чтобы все заработало.

Выхлоп, после запуска:

QVariant::save: unable to save type 'QObject*' (type id: 39).

sukhorukov
() автор топика
Ответ на: комментарий от RazrFalcon

У QVariant нет метода save.

Не поверите, есть не только 'save', но еще и 'load', во всяком случае в Qt 5.7.

Если бы не было метода, программа бы не скомпилировалась.

Код рабочий, мучаю его сейчас. Вот вариант с тестовым классом. С тестовом классом перегрузка операторов работает, с QObject полный игнор.

Тестовый класс «test.h»:

#ifndef TEST_H
#define TEST_H

#include <QObject>

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

#endif // TEST_H

Тело программы «Main.cpp»:

#include <QCoreApplication>
#include <qobject.h>
#include <qmetatype.h>
#include <qdatastream.h>
#include <qvariant.h>
#include <qdebug.h>

#include "test.h"

QDataStream &operator <<(QDataStream &out, const QObject *object)
{
    Q_UNUSED(object);
    qDebug() << "Перегрузка << - класс QObject";
    return out;
}
QDataStream &operator >>(QDataStream &in, QObject *object)
{
    Q_UNUSED(object);
    qDebug() << "Перегрузка >> - класс QObject";
    return in;
}

QDataStream &operator <<(QDataStream &out, const Test *object)
{
    Q_UNUSED(object);
    qDebug() << "Перегрузка << - класс Test";
    return out;
}
QDataStream &operator >>(QDataStream &in, Test *object)
{
    Q_UNUSED(object);
    qDebug() << "Перегрузка >> - класс Test";
    return in;
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QDataStream stream;
    QVariant var;

    qRegisterMetaTypeStreamOperators<QObject*>();
    QObject* ob = new QObject();
    var.setValue(ob);
    var.save(stream);

    qRegisterMetaTypeStreamOperators<Test*>("Test");
    Test* test = new Test();
    var.setValue(test);
    var.save(stream);

    return 0;
}

Выхлоп в консоль:

QVariant::save: unable to save type 'QObject*' (type id: 39).

Перегрузка << - класс Test
Для закрытия данного окна нажмите <ВВОД>...

sukhorukov
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.