总是提示: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