【发布时间】:2016-04-28 06:56:06
【问题描述】:
我正在尝试为一个名为 Unit 的自定义类定义运算符 >> 和
这是我定义函数的方式
QDataStream &operator<<(QDataStream &out, const Unit *unit)
{
out << unit->value();
return out;
}
QDataStream &operator>>(QDataStream &in, Unit *unit)
{
double value;
in >> value;
unit->setUserValue(value);
return in;
}
void Unit::setUserValue(const qreal userValue)
{
qDebug() << "setUserValue" << this->userValue() << userValue << QString::number(m_unit,2);
if (this->userValue() == userValue)
return;
if(isDefault())
m_value = userValue;
else
m_value = UnitManager::convertFrom(userValue,m_unit);
qDebug() << "Value" << m_value;
emit userValueChanged();
setDirty(RamDirty);
}
qRegisterMetaType<Unit*>();
qRegisterMetaTypeStreamOperators<Unit *>();
我收到以下编译错误消息
error: no match for 'operator>>' (operand types are 'QDataStream' and 'Unit*')
这里还有一个错误
/usr/include/qt/QtCore/qmetatype.h:771: error: invalid initialization of non-const reference of type 'quint8& {aka unsigned char&}' from an rvalue of type 'quint8 {aka unsigned char}'
stream >> *static_cast<T*>(t);
^
我还定义了元类型
Q_DECLARE_METATYPE(Unit)
Q_DECLARE_METATYPE(Unit*)
单元类接口
class Unit : public EraObject
{
Q_OBJECT
Q_PROPERTY(qreal userValue READ userValue WRITE setUserValue NOTIFY userValueChanged)
Q_PROPERTY(quint32 category READ category CONSTANT)
Q_PROPERTY(quint32 unit READ unit WRITE setup)
Q_PROPERTY(QString symbol READ symbol NOTIFY symbolChanged)
Q_ENUMS(CategoryId)
Q_ENUMS(UnitId)
public:
Unit(const Unit &other);
Unit(int unit = Default, QObject *parent = 0);
~Unit() {}
enum CategoryId {
NoneCategory,
TemperatureCategory,
PressureCategory,
CountCategory
};
enum UnitId {
Default = NoneCategory,
//Temperature
Celsius = TemperatureCategory << 16, Fahrenheit,
CountTemperature,
//Pressure
Pascal = PressureCategory << 16, Bar,
CountPressure
};
qreal value() const { return m_value; }
qreal userValue() const;
quint32 category() const { return m_unit >> 16 ; }
quint32 unit() const { return m_unit; }
QString symbol() const;
inline bool isDefault() const { return !(m_unit & 0xffff); }
//Operators
operator qreal() const;
Unit& operator=(const qreal value);
bool operator==(const Unit &other) const { return (m_value == other.m_value); }
bool operator<(const Unit &other) const { return (m_value < other.m_value); }
void loadFrom(Settings &set, bool ownGroup = true) override;
void saveTo(Settings &set, bool ownGroup = true, bool force = false) override;
private:
qreal m_value;
quint32 m_unit;
signals:
void userValueChanged();
void unitChanged(int unit);
void symbolChanged();
public slots:
void changeUnit(const quint32 &unit);
void setUserValue(const qreal userValue);
void setup(quint32 unit, const QString name = QString(),QObject *parent = 0);
};
Q_DECLARE_METATYPE(Unit*)
更新:
QDataStream &operator<<(QDataStream &out, const Unit *&unit)
{
out << unit->value();
return out;
}
QDataStream &operator>>(QDataStream &in, Unit *&unit)
{
qreal value;
in >> value;
unit->setUserValue(value);
return in;
}
我在 MAIN 中定义
qRegisterMetaType<Unit*>();
qRegisterMetaTypeStreamOperators<Unit *>();
在我定义的 Unit.h 的标题中
Q_DECLARE_METATYPE(Unit*)
Q_DECLARE_METATYPE(Unit)
【问题讨论】:
-
你如何使用这些功能?您能尝试创建一个Minimal, Complete, and Verifiable Example 并展示给我们看吗?请在问题正文中包含完整且未经编辑的错误输出。
-
我没有使用这些函数,它们是为在 qsettings 中保存和加载自定义类而定义的
-
@JoachimPileborg 我编辑了问题
-
不错的新帐户@andreahmed
-
@AlexisP。你在这里找到问题了吗?