将流运算符添加到Qt对象

时间:2016-12-17 21:45:36

标签: c++ qt

是否可以将流运算符添加到现有Qt对象?我尝试在这个示例代码中执行此操作(对于QFileSystemWatcher),最后一行不进行编译。 LineUser示例已编译。

Documentation for registering stream operators

#include <QtCore>

class LineUser {
public:
    int uId;
    QString passwd;
    qint8 statusType;
};

Q_DECLARE_METATYPE(LineUser)
QDataStream &operator<<(QDataStream &out, const LineUser &myObj) {
    out<<myObj.uId<<myObj.passwd<<myObj.statusType;
    return out;
}
QDataStream &operator>>(QDataStream &in, LineUser &myObj) {
    in>>myObj.uId>>myObj.passwd>>myObj.statusType;
    return in;
}

QDataStream &operator<<(QDataStream &out, const QFileSystemWatcher &myObj) {
    return out;
}
QDataStream &operator>>(QDataStream &in, QFileSystemWatcher &myObj) {
    return in;
}

int main() {
    qRegisterMetaTypeStreamOperators<LineUser>("LineUser");
    qRegisterMetaTypeStreamOperators<QFileSystemWatcher>("QFileSystemWatcher");
}

编译器消息很长,这里有一些错误:

error: use of deleted function ‘QFileSystemWatcher::QFileSystemWatcher(const QFileSystemWatcher&)’
                 return new (where) T(*static_cast<const T*>(t));
note: ‘QFileSystemWatcher::QFileSystemWatcher(const QFileSystemWatcher&)’ is implicitly deleted because the default definition would be ill-formed:
  class Q_CORE_EXPORT QFileSystemWatcher : public QObject error: ‘QObject::QObject(const QObject&)’ is private
         Q_DISABLE_COPY(QObject) 
error: within this context  class Q_CORE_EXPORT QFileSystemWatcher : public QObject note: declared here
         Q_DISABLE_COPY(QObject)

1 个答案:

答案 0 :(得分:1)

来自here

  

任何具有公共默认构造函数的公共类或结构   复制构造函数和公共析构函数可以注册。

来自here

  

QObject既没有复制构造函数也没有赋值运算符。   这是设计的。

显然,有一个设计限制阻止QObject派生被注册为元类型(并且它也是有意义的,因为它不是必需的,因为默认情况下会为它们生成元信息),因此{{ 1}}也是禁止的。

它应该适用于qRegisterMetaTypeStreamOperators