• 7281阅读
  • 3回复

为什么我的update()函数无法引起paintEvent()的调用呀? [复制链接]

上一主题 下一主题
离线ch19860304
 
只看楼主 倒序阅读 楼主  发表于: 2009-06-02
我最近写了个程序,用paintEvent来画图,但始终没有画成功。似乎是update()没有引起paintEvent的调用。你能帮我看一下,万分感激!!程序还在调试,功能就是:作一个框架,显示一张图片。框架是一个类,它继承了QMainWindow。图片的显示是一个类,它继承了QWidget,改写了paintEvent方法。但现在连图片都显示不了。我把我的程序贴出来吧:





/*图片的显示是一个类,它继承了QWidget,改写了paintEvent方法。*/
/*类的声明*/

class Imageviewer:public QWidget
{
    Q_OBJECT

    public:
        Imageviewer();
        void setPixmap(QString filename) ;

    protected:
        void paintEvent ( QPaintEvent *event ) ;

    private:
        QPixmap pixmap ;
};

/*类的定义*/
Imageviewer::Imageviewer()
{    
    pixmap = QPixmap("/mnt/hgfs/share_file/qt_image/3.jpg");
    qDebug("111 pixmap is null? %d", pixmap.isNull());    
}

void Imageviewer::setPixmap(QString filename)
{
    pixmap.load(filename) ;
    update() ;
    qDebug("222 pixmap is null? %d:%s", pixmap.isNull(),qPrintable(objectName()));    
}

void Imageviewer::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);  
    painter.drawPixmap(0, 0, pixmap);
         /*没有被调用*/
    qDebug("333 pixmap is null? %d", pixmap.isNull());
}


/*框架是一个类,它继承了QMainWindow*/
/*类的声明*/
class Imagewindow :public QMainWindow
{
    Q_OBJECT

    public:
        Imagewindow() ;
    private:
        QScrollArea *scrollArea ;
        Imageviewer *image;

};


/*类的定义*/
Imagewindow::Imagewindow()
{
    scrollArea = new QScrollArea ;
    image = new Imageviewer;    
    scrollArea -> setWidget(image);
    setCentralWidget(scrollArea);
    image->setPixmap("/mnt/hgfs/share_file/qt_image/3.jpg") ;
}

/*主函数*/
int main(int argc, char *argv[])
{    
    QApplication app(argc, argv);                
    Imagewindow *pWidget = new Imagewindow;
    pWidget->resize(300, 300);
    pWidget->show();
    return app.exec();
}
离线rqzrqh

只看该作者 1楼 发表于: 2009-06-02
imageviwer中就应该包含了图片的重载,这样的话只需要在windowviewer的构造函数中定义imageviewer就能够实现图片的重载
离线yang_huafeng

只看该作者 2楼 发表于: 2009-06-02
你把update()写在Imagewindow中试试,

Imagewindow::Imagewindow()
{
    scrollArea = new QScrollArea ;
    image = new Imageviewer;    
    scrollArea -> setWidget(image);
    setCentralWidget(scrollArea);
    image->setPixmap("/mnt/hgfs/share_file/qt_image/3.jpg") ;

   update();
}
QT使用中...
离线wader
只看该作者 3楼 发表于: 2009-06-02
产生此现象的原因是,派生于Widget的类Imageviewer没有一个正确的建议(默认)大小,至少Qt不知道,所以将它放到一个QScrollArea对象中时,这个QSrollArea对象也不知道,有可能它会认为这个自定义的Widget的大小是 (0, 0) ,所以看不到画在上面的图片。要解决这个问题,可以在每次加载完图片后,更改Imageviewer对象的大小(给它一个提示),这样QScrollArea也就知道它所包含的对象的大小了,代码如下
  1.     pixmap.load(filename);
  2.     setMinimumSize(pixmap.size());
  3.     update();
[ 此帖被wader在2009-06-02 16:40重新编辑 ]
快速回复
限100 字节
 
上一个 下一个