• 4276阅读
  • 1回复

这种读入文件的方式有哪些问题? [复制链接]

上一主题 下一主题
离线noeatfox
 

只看楼主 倒序阅读 楼主  发表于: 2014-01-26
总是提示:QGraphicsScene::addItem: cannot add null item但我明名有输入的啊:
**这是友元函数的声明:
class City:public QGraphicsItem
{
public:
    City();
    City(QString name,QPointF pos,QString masterMan);

    friend QDataStream& operator<<(QDataStream &out,City* city);
    friend QDataStream& operator>>(QDataStream &in, City* city);
    bool addPath(QPainterPath* path);
    bool addPath(QPainterPath path);
。。。。。。。。。。。
}

**友元函数定义:
QDataStream &operator<<(QDataStream &out,City* city)
{
    qDebug()<<"int the out operator";
    QString temp=city->getName();
    out<<temp<<city->pos()<<city->master;//<<city.pathList;
    return out;
}


QDataStream &operator>>(QDataStream &in, City *city)
{
    QString temp;
    QPointF point;
    QString master;
    qDebug()<<"in the in function temp=";
    in>>temp>>point>>master;    
    city=new City(temp,point,master);

    return in;
}


**在另一个类中企图调用该操作符,总是失败(因为出现QDEBUG()应显示的语句:
ScribbleArea::ScribbleArea()
{
     setAttribute(Qt::WA_StaticContents);
     modified = false;
     scribbling = false;
     myPenWidth = 1;
     myPenColor = Qt::blue;

     scene=new QGraphicsScene(0,0,1800,1000,this);
     setScene(scene);

     QFile file("wlcenhence.dat");
     if(!file.open(QIODevice::ReadWrite))
     {
         qDebug()<<"wrong open file";
         return;
     }
     QDataStream in(&file);
     in>>cities;//这样输入有问题吗???????????????????????????????????????????


     for(int i=0;i<cities.count();i++)
     {
         scene->addItem(cities);
     }

     update();
}
这是在类构造函数想读文件的情形,还有个SAVE()函数,目的是存盘:
bool ScribbleArea::save()
{
    qDebug()<<"in the beginning of area save";
    QFile file("wlcenhence.dat");
    if(!file.open(QIODevice::ReadWrite))
    {
        qDebug()<<"wrong when write files";
        return false;
    }
                                qDebug()<<"int mid of area save,cities=";
    QDataStream out(&file);
    
    foreach(City *city,cities) out<<city;
    file.flush();
    return true;
}

整个程序能正常运行,后两个函数里的QDEBUG()语句都能正常显示,但就是存盘无效,调入也无效,就象是没有调用操作符一样,请问怎么回事?
附,SCRIBBLEAREA的头文件
#ifndef SCRIBBLEAREA_H
#define SCRIBBLEAREA_H
#include <QtGui>
class QString;
class QColor;


class City;
class PreWindow;
class ScribbleArea : public QGraphicsView
{
    Q_OBJECT
public:
    ScribbleArea();


    bool save();

    inline bool isModified() const{return modified;}
    inline QColor penColor() const{return myPenColor;}
    inline int penWidth() const {return myPenWidth;}

public slots:
    //void clearImage();
    //void print();

protected:
    void mousePressEvent(QMouseEvent *);


private:
    //void drawLineTo(const QPoint &endPoint);
    //void resizeImage(QImage *image,const QSize &newSize);

    bool modified;
    bool scribbling;
    int myPenWidth;
    QColor myPenColor;
    QImage image;
    QPoint lastPoint;

    QList<City *> cities;
    QGraphicsScene *scene;

};

#endif // SCRIBBLEAREA_H


离线noidea

只看该作者 1楼 发表于: 2014-01-27
QDataStream in(&file);
in>>cities;
这里你本意想读取file文件,并且赋值给cities。

而你的定义在这里
QList<City *> cities;
你定义了一个cities的QList,但是City你被没有初始化,所以这里的City*都是NULL。

所以你并没有给cities赋值成功
而后你又试图添加这个null给addItem,所以会有此错误。
  for(int i=0;i<cities.count();i++)
  {
         scene->addItem(cities);
  }

我猜测你是想添加一个个的City,而不是这里的cities。
  for(int i=0;i<cities.count();i++)
  {
         scene->addItem(cities.at(i));
  }



talk in code
Qt5.2.1 + MacOSX10.9
快速回复
限100 字节
 
上一个 下一个