Пользовательские проблемы QVariant - PullRequest
0 голосов
/ 09 мая 2018

Я открываю пользовательские типы с помощью QVariant и пытаюсь реализовать их в своем проекте. Проблема в том, что создается впечатление, что он создает объект с конструктором по умолчанию, когда я думал, что он будет использовать конструктор копирования ...

Может быть, есть что-то, чего я не понимаю ...

Вот мой пользовательский класс:

Parameter.h

#ifndef PARAMETER_H
#define PARAMETER_H
#include <QDebug>
#include <QMetaType>

#include "variable.h"
#include <QAbstractTableModel>

class Parameter : public Variable, public QAbstractTableModel
{
public:
    Parameter();
    Parameter(QString name, int min, int max, int val, QObject *parent);
    Parameter(const Parameter &source);

private:
    int m_value;
};
Q_DECLARE_METATYPE(Parameter)

#endif // PARAMETER_H

Parameter.cpp

include "parameter.h"

Parameter::Parameter() : Variable()
{
    qDebug()<<"Default constructor";
    m_value = 0;
    setName("Test");
}

Parameter::Parameter(QString name, int min, int max, int val, QObject     *parent)
: Variable(name, min, max), QAbstractTableModel(parent)
{
    qDebug()<<"constructor";
    m_value = val;
}

 Parameter::Parameter(const Parameter &source)
     : Variable(source.getName(), source.getMin(), source.getMax()),
      QAbstractTableModel(),
      m_value(source.m_value)
{
    qDebug()<<"copy constructor";  
}

Я создаю экземпляр Parameter в классе MainWindow. Следующий код является выдержкой конструктора этого класса:

Parameter *param = new Parameter("Param",0,100,10, this);
QVariant v = QVariant::fromValue(param);
Parameter op = v.value<Parameter>();
qDebug()<< op.getName();

Вывод этого кода:

constructor
Default constructor 
Default constructor
"Test"

Я хотел бы понять, почему конструктор по умолчанию вызывается дважды. И что я должен сделать, чтобы вместо этого он вызывал конструктор копирования (чтобы получить созданный мной объект, имя которого «Param»)

Большое спасибо за ваши ответы:)

1 Ответ

0 голосов
/ 09 мая 2018

Вы храните указатель в вашем QVariant вместо значения. Но хочу получить значение.

Если значение не может быть преобразовано, будет возвращено значение, созданное по умолчанию.

, поэтому v.value<Parameter>(); возвращает созданный по умолчанию объект, поскольку Parameter* не может быть преобразован в Parameter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...