• 8328阅读
  • 16回复

[提问]QPixmap 对象赋值的问题(代码已贴,大家帮忙分析一下) [复制链接]

上一主题 下一主题
 

只看楼主 倒序阅读 楼主  发表于: 2012-12-06
PictureWidget::PictureWidget(QWidget *parent)
    :QWidget(parent){
    connect(&networkAccessManager, SIGNAL(finished(QNetworkReply*)),this, SLOT(solt_ReadyReadPicture(QNetworkReply*)));
    pixmap.load(QDir::toNativeSeparators(":/images/sys_background.jpg"));
}


void PictureWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawPixmap(0,0,pixmap);
}


void PictureWidget::slot_Display(Song song)
{
    prepixmap = pixmap;
    QString picture = song.picture.toString();
    GetPicture(QUrl(picture));
}


bool PictureWidget::GetPicture(QUrl picture)
{
    networkAccessManager.get(QNetworkRequest(picture));
     return true;
}


bool PictureWidget::solt_ReadyReadPicture(QNetworkReply* reply)
{
    prepixmap.loadFromData(reply ->readAll());
    this ->update();
    return true;
}


代码贴出来了。如上.solt_ReadyReadPicture函数中是prepixmap加载的图片,但是我在paintEvent中是画的pixmap.图像同样被更改了. 赋值的地方,我是用prepixmap = pixmap。请大神们帮我分析一下,调用slot_Display的时候为什么paintEvent中画的图是prepixmap读取的数据?
我测试过注释prepixmap = pixmap;这句,这样就画不出来了。




只看该作者 1楼 发表于: 2012-12-06
大神们啊。都来说说 。在线等啊
离线roywillow

只看该作者 2楼 发表于: 2012-12-06
为什么你要说pixmap1是2的引用呢?隐式共享?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。

只看该作者 3楼 发表于: 2012-12-06
QPixmap pixmap1;
QPixmap pixmap2;
pixmap1=pixmap2;
在我的程序里面 改变pixmap1后pixmap2也会变
然后我看到头文件里面 有重写运算符
QPixmap &operator=(const QPixmap &);

只看该作者 4楼 发表于: 2012-12-06
回 2楼(roywillow) 的帖子
在我的程序里面 改变pixmap1后pixmap2也会变
然后我看到头文件里面 有重写运算符
QPixmap &operator=(const QPixmap &);

只看该作者 5楼 发表于: 2012-12-06
真是捉急啊.
难道就没有人能告诉一下么?
离线jdwx

只看该作者 6楼 发表于: 2012-12-06
回 5楼(也许的火柴) 的帖子
这样的问题不会出现的,那是两个QPixmap。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线weiweiqiao

只看该作者 7楼 发表于: 2012-12-06
qpixmap本身的赋值copy应该实现了吧?如果没有那你就要自己重写了。。
Jobs Insanely Great.
离线weiweiqiao

只看该作者 8楼 发表于: 2012-12-06
回 6楼(jdwx) 的帖子
这个id好像在csdn上也见过。。。J:)
Jobs Insanely Great.
离线jdwx

只看该作者 9楼 发表于: 2012-12-06
回 8楼(weiweiqiao) 的帖子
没错!
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。

只看该作者 10楼 发表于: 2012-12-06
回 6楼(jdwx) 的帖子
事实是出现了。我都把运算符重载声明贴出来了。实际应用中确实如此。
现在我想的是用指针。暂时解决了问题。但是帖子中的问题还不知道如何解决。

只看该作者 11楼 发表于: 2012-12-06
回 7楼(weiweiqiao) 的帖子
谢谢,还在研究。
离线jdwx

只看该作者 12楼 发表于: 2012-12-06
回 10楼(也许的火柴) 的帖子
经过测试,不会出现任何问题,就是两个QPixmap。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。

只看该作者 13楼 发表于: 2012-12-07
回 12楼(jdwx) 的帖子
我单独测试了一下 确实是你说的这样子
看来我要找另外的原因了。

只看该作者 14楼 发表于: 2012-12-07
PictureWidget::PictureWidget(QWidget *parent)
    :QWidget(parent){
    // TODO Auto-generated constructor stub
    connect(&networkAccessManager, SIGNAL(finished(QNetworkReply*)),this, SLOT(solt_ReadyReadPicture(QNetworkReply*)));

    this -> setMinimumHeight(200);
    this -> setMinimumWidth(250);
    pixmap.load(QDir::toNativeSeparators(":/images/sys_background.jpg"));
}

PictureWidget::~PictureWidget() {
    // TODO Auto-generated destructor stub
}


void PictureWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawPixmap(0,0,pixmap);
}

void PictureWidget::slot_Display(Song song)
{
    prepixmap = pixmap;
    QString picture = song.picture.toString();
    picture.replace("mpic","lpic");

    //QTextStream out(stdout);
    //out << picture;

    GetPicture(QUrl(picture));
}

bool PictureWidget::GetPicture(QUrl picture)
{
    networkAccessManager.get(QNetworkRequest(picture));
     return true;
}

bool PictureWidget::solt_ReadyReadPicture(QNetworkReply* reply)
{
    prepixmap.loadFromData(reply ->readAll());

    //pixmap = pixmap.scaled(this ->width(),this ->height(),Qt::KeepAspectRatioByExpanding,Qt::SmoothTransformation);
    //QPainter painter(this);
    //painter.drawPixmap(20,20,pixmap.width(),pixmap.height(),pixmap);
    this ->update();
    return true;
}

只看该作者 15楼 发表于: 2012-12-07
代码贴出来了 大神们帮我分析一下原因。
如上代码。背景图依然可以被替换。

只看该作者 16楼 发表于: 2012-12-07
回 12楼(jdwx) 的帖子
代码已贴,帮我分析一下问题。
快速回复
限100 字节
 
上一个 下一个