• 15338阅读
  • 41回复

如何显示一个图片并使其随窗体同步缩放?问题已解决,感谢iiiyyyhhhsss [复制链接]

上一主题 下一主题
离线kingnight
 
只看楼主 倒序阅读 楼主  发表于: 2009-09-18
问题已解决,感谢iiiyyyhhhsss ,问题出在qrc文件,
路径设置不对
新建prefix默认为/new/prefix1
所以路径为“:/new/prefix1/images/wind800600.png”    感谢iiiyyyhhhsss


我测试了,是图片加载问题,
QString file=QString::fromUtf8(":images/wind800600.png");
ImageShow=_image.load(file,"PNG");
qDebug("ImageShow=%s\n",ImageShow?"TRUE":"FALSE");

显示是FALSE;


ImageShow=FALSE

QImage::scaled: Image is a null image
QImage::scaled: Image is a null image

我现在PNG图片放在项目文件下images目录下,名称是wind800600.png,在qrc资源文件里已将图片加入,请问使用方法有错误吗?

_image.load(":images/wind800600.png");
直接load我也试过,结果都是黑屏

原文如下:

21、如何显示一个图片并使其随窗体同步缩放
答:下面给出一个从QWidget派生的类ImageWidget,来设置其背景为一个图片,并可随着窗体改变而改变,其实从下面的代码中可以引申出其它许多方法,如果需要的话,可以从这个类再派生出其它类来使用。
头文件: ImageWidget.hpp

Quote:#ifndef IMAGEWIDGET_HPP
#define IMAGEWIDGET_HPP

#include <QtCore>
#include <QtGui>

class ImageWidget : public QWidget
{
    Q_OBJECT
public:
    ImageWidget(QWidget *parent = 0, Qt::WindowFlags f = 0);
    virtual ~ImageWidget();
protected:
    void resizeEvent(QResizeEvent *event);
private:
    QImage _image;
};

#endif

CPP文件: ImageWidget.cpp

Quote:#include "ImageWidget.hpp"

ImageWidget::ImageWidget(QWidget *parent, Qt::WindowFlags f)
    : QWidget(parent, f)
{
   _image.load("image/image_background");
    setAutoFillBackground(true);   // 这个属性一定要设置
    QPalette pal(palette());
    pal.setBrush(QPalette::Window,
                QBrush(_image.scaled(size(), Qt::IgnoreAspectRatio,
                        Qt::SmoothTransformation)));
    setPalette(pal);
}

ImageWidget::~ImageWidget()
{
}

// 随着窗体变化而设置背景
void ImageWidget::resizeEvent(QResizeEvent *event)
{
    QWidget::resizeEvent(event);
    QPalette pal(palette());
    pal.setBrush(QPalette::Window,
                QBrush(_image.scaled(event->size(), Qt::IgnoreAspectRatio,
                        Qt::SmoothTransformation)));
    setPalette(pal);
}
[ 此帖被kingnight在2009-09-20 14:26重新编辑 ]
离线rqzrqh

只看该作者 1楼 发表于: 2009-09-18
main.cpp内有打开了qrc文件?
离线iiiyyyhhhsss

只看该作者 2楼 发表于: 2009-09-18
图片怎么没有后缀名呢?你再试试看
我感觉这种情况一般是路径错误
离线kingnight
只看该作者 3楼 发表于: 2009-09-18
我实际程序已经写.png扩展名了,
mian.cpp也已经Q_INIT_RESEOURCE(imagewidget);
离线kingnight
只看该作者 4楼 发表于: 2009-09-18
版主给点意见呀,我是您介绍的方法做的呀
离线iiiyyyhhhsss

只看该作者 5楼 发表于: 2009-09-18
给我的给你
创建对象用下句
MQWidget *mQWidget=new MQWidget(0,你的图片路径)

-----------------------------------------------------
#ifndef MQWIDGET_H
#define MQWIDGET_H

#include <QtGui>        


class MQWidget : public QWidget
{
    Q_OBJECT        

    public:                                  
    MQWidget(QWidget *parent,const QString filename);          
    virtual ~MQWidget();

    protected:
    void resizeEvent(QResizeEvent *event);          

    public:
    QImage background;  
};        
#endif // MQWIDGET_H
---------------------------------------------
#include "MQWidget.h"

MQWidget::~MQWidget() {}                
MQWidget::MQWidget(QWidget *parent,const QString filename)      
        : QWidget(parent)                
{
    this->background.load(filename);
}

void MQWidget::resizeEvent(QResizeEvent *event)              
{
    QWidget::resizeEvent(event);                    

    QPalette pal;              
    pal.setBrush(QPalette::Window,QBrush(this->background.scaled(event->size())));  
    setPalette(pal);
}
离线kingnight
只看该作者 6楼 发表于: 2009-09-18
还是不行呀
错误提示

QImage ::scaled :Image is a null image
QImage ::scaled :Image is a null image

png格式图片不可以吗,难道需要矢量图?
离线rqzrqh

只看该作者 7楼 发表于: 2009-09-18
bool QImage::load ( const QString & fileName, const char * format = 0 )

Loads an image from the file with the given fileName. Returns true if the image was successfully loaded; otherwise returns false.

The loader attempts to read the image using the specified format, e.g., PNG or JPG. If format is not specified (which is the default), the loader probes the file for a header to guess the file format.

The file name can either refer to an actual file on disk or to one of the application's embedded resources. See the Resource System overview for details on how to embed images and other resource files in the application's executable.

查看返回值
离线iiiyyyhhhsss

只看该作者 8楼 发表于: 2009-09-18
你的路径如何写?
离线xlttap

只看该作者 9楼 发表于: 2009-09-18
我的想法是利用双缓冲机制:
1、把这图片image放到一个pixmap中
2、把这个pixmap的内容画以当前的widget中,其中pixmap的大小设为窗口的大小。
这两步就能实现你图片随窗口大小改而改变。
我简单我快乐
离线iiiyyyhhhsss

只看该作者 10楼 发表于: 2009-09-18
应该是路径问题了,我刚才特意把自己的路径写错,也是显示      
QImage ::scaled :Image is a null image

你不如直接点击图片属性,然后把它的路径copy到你代码里好了,因为有时无论你如何仔细检查,路径始有些地方错了,你总是看不出的
[ 此帖被iiiyyyhhhsss在2009-09-18 19:28重新编辑 ]
离线iiiyyyhhhsss

只看该作者 11楼 发表于: 2009-09-18
有可能的一种情况是,你的图像本来不是png的,只是后缀给人改成png了,它可能是jpg或者其它格式的,这样就算路径全对也是有读不进来的,我试过这种情况。。。
离线kingnight
只看该作者 12楼 发表于: 2009-09-19
大家再给点意见吧,还是有问题,是QImage load加载的问题
离线iiiyyyhhhsss

只看该作者 13楼 发表于: 2009-09-19
你把你加载图片那行代码贴上来看看
离线kingnight
只看该作者 14楼 发表于: 2009-09-19
    ImageShow=_image.load(":images/wind800600.png","PNG");
    //qDebug("ImageShow=%s\n",ImageShow?"TRUE":"FALSE");
我现在PNG图片放在项目文件下images目录下,名称是wind800600.png,在qrc资源文件里已将图片加入,请问使用方法有错误吗?

QString file=QString::fromUtf8(":images/wind800600.png");
ImageShow=_image.load(file,"PNG");
qDebug("ImageShow=%s\n",ImageShow?"TRUE":"FALSE");

都不行,另外
编译有waring
C:\DOCUME~1\jk\LOCALS~1\Temp/ccwulqWj.s:111: Warning: .stabn: description field '1002d' too big, try a different debug format
类似很多
离线dbzhang800

只看该作者 15楼 发表于: 2009-09-19
引用第14楼kingnight于2009-09-19 21:28发表的  :
    ImageShow=_image.load(":/images/wind800600.png","PNG");
    //qDebug("ImageShow=%sn",ImageShow?"TRUE":"FALSE");
我现在PNG图片放在项目文件下images目录下,名称是wind800600.png,在qrc资源文件里已将图片加入,请问使用方法有错误吗?
QString file=QString::fromUtf8(":images/wind800600.png");
.......
离线iiiyyyhhhsss

只看该作者 16楼 发表于: 2009-09-19
路径要么是":/images/wind800600.png"(qrc资源文件路径),要么是"images/wind800600.png"(当前目录下的文件路径)
[ 此帖被iiiyyyhhhsss在2009-09-19 21:52重新编辑 ]
离线kingnight
只看该作者 17楼 发表于: 2009-09-19
谢谢dbzhang800 和iiiyyyhhhsss
路径我改了,以下我都试了

(1)_image.load(":/images/wind800600.png");  
(2) QString file=QString::fromUtf8(":/images/wind800600.png");  
ImageShow=_image.load(file,"PNG");
(3) ImageShow=_image.load(":/images/wind800600.png","PNG");
依然不显示
QImage::scaled: Image is a null image
QImage::scaled: Image is a null image
DllMain DLL_PROCESS_DETACH

windows环境 qt creator
离线iiiyyyhhhsss

只看该作者 18楼 发表于: 2009-09-19
有没有试过其它图片?试一试jpg的。。
离线kingnight
只看该作者 19楼 发表于: 2009-09-19
试过jpg,效果一样
离线iiiyyyhhhsss

只看该作者 20楼 发表于: 2009-09-19
是不是你的_image之前已经load过图片,这里load第二次了?
离线kingnight
只看该作者 21楼 发表于: 2009-09-19
没有,所有代码
附件: test4.rar (2386 K) 下载次数:15
离线iiiyyyhhhsss

只看该作者 22楼 发表于: 2009-09-19
解压还需要密码?密码多少?
[ 此帖被iiiyyyhhhsss在2009-09-19 23:17重新编辑 ]
离线kingnight
只看该作者 23楼 发表于: 2009-09-19
不需要呀
附件: test4.rar (2634 K) 下载次数:11
离线kingnight
只看该作者 24楼 发表于: 2009-09-19
不好意思,上传的文件好像有问题,每次好像都传不完整
离线dbzhang800

只看该作者 25楼 发表于: 2009-09-19
打包的时候只打包你的自己写的部分,不要把中间生成的东西都打包
离线kingnight
只看该作者 26楼 发表于: 2009-09-20
再次上传,所有代码
附件: test4.rar (1013 K) 下载次数:12
离线iiiyyyhhhsss

只看该作者 27楼 发表于: 2009-09-20
不知我电脑有问题,还是你电脑有问题,还是解压不了。。
离线iiiyyyhhhsss

只看该作者 28楼 发表于: 2009-09-20
你不如不用打包,直接把所有的cpp,h和ui以附件形式上传好了
离线kingnight
只看该作者 29楼 发表于: 2009-09-20
先谢了,这次看看如何(1)
附件: imagewidget.cpp (1 K) 下载次数:9
离线kingnight
只看该作者 30楼 发表于: 2009-09-20
第二个
附件: imagewidget.h (1 K) 下载次数:5
离线kingnight
只看该作者 31楼 发表于: 2009-09-20
第三个
imagewidget.qrc
<RCC>
    <qresource prefix="/new/prefix1" >
        <file>images/wind800600.png</file>
    </qresource>
</RCC>
离线iiiyyyhhhsss

只看该作者 32楼 发表于: 2009-09-20
其它呢?通过添加附件,可以一次上传多个文件。。。。
离线kingnight
只看该作者 33楼 发表于: 2009-09-20
第四个
附件: main.cpp (1 K) 下载次数:3
离线kingnight
只看该作者 34楼 发表于: 2009-09-20
第五个
附件: test4.pro (1 K) 下载次数:5
离线iiiyyyhhhsss

只看该作者 35楼 发表于: 2009-09-20
引用第31楼kingnight于2009-09-20 14:04发表的  :
第三个
imagewidget.qrc
<RCC>
    <qresource prefix="/new/prefix1" >
        <file>images/wind800600.png</file>
.......


当你用qrc资源时候,你把图片添加在new/prefix1里了,所以路径应该是:/new/prefix1/images/wind800600.png
离线kingnight
只看该作者 36楼 发表于: 2009-09-20
最后
images下图片
离线kingnight
只看该作者 37楼 发表于: 2009-09-20
哈哈哈,真是太谢谢了 iiiyyyhhhsss ,你在北京吗,有机会请你吃饭
终于解决了,我还是新手,谢谢了,要学的太多了
离线iiiyyyhhhsss

只看该作者 38楼 发表于: 2009-09-20
其实如果你的images文件夹是放在你的工程目录下的话,可以不用添加qrc资源,直接用"images/wind800600.png"就可以的了,

我现在都是这样用的,你试试看

注:不是"/images/wind800600.png"
离线shixianzhi
只看该作者 39楼 发表于: 2010-04-24
请问版主,我用QT-4.5.0 ,用上述方法可以实现吗
快速回复
限100 字节
 
上一个 下一个