首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QLabel与QGraphicsView性能

QLabel与QGraphicsView性能
EN

Stack Overflow用户
提问于 2012-09-21 08:27:14
回答 1查看 1.6K关注 0票数 12

我正在学习QT,我对QLabel和QGraphics视图在平移时的性能差异感到困惑。

我将一个巨大的36M像素(D800)的jpeg文件读取到QLabel或QGraphics对象中,并尝试使用QLabel/Graphics拖动全尺寸图像。令人惊讶的是,QLabel提供了真正平滑的移动,而QGRaphicsView平移却是颠簸的。

简化的QGraphicsView代码为:

代码语言:javascript
复制
QApplication::setGraphicsSystem("raster");    
...
QGraphicsView  view();
view.setDragMode(QGraphicsView::ScrollHandDrag);
view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view.setFrameStyle(QFrame::NoFrame);
view.showFullScreen();

QGraphicsPixmapItem *pmItem = new QGraphicsPixmapItem(pixMap);
scene.addItem(pmItem); // only one item in the scene
//view.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); // no difference
view.show();

基于QLabel的简化代码为:

代码语言:javascript
复制
void MyQLabel::mouseMoveEvent(QMouseEvent *event){
    if(_leftButtonPressed) {
            // calculate new {_x, _y} position
            repaint();
        }
    } else super::mouseMoveEvent(event);
}
void MyQLabel::paintEvent(QPaintEvent *aEvent){
    QPainter paint(this);
    paint.drawPixmap(_x, _y, pixMap);
}

... // Somewhere in the code:
MyQLabel _myLabel(NULL);
_myLabel.showFullScreen();
_myLabel.show();

感觉就像QGraphicsView跳过了一些位置(通过快速拖动),而QLabel则在所有中间图像上绘制。

我错过了什么?

谢谢你,艾利克斯

EN

回答 1

Stack Overflow用户

发布于 2021-08-29 09:19:55

很可能,当检测到滚动更改时,QGraphicsView会调用update()。而你的标签调用repaint()

不同之处在于,update()安排了对repaint()的呼叫,而对update()的多个快速呼叫可能会一次调用repaint()

快速拖动时,可能会在短时间内注册多个鼠标事件。QGraphicsView将处理所有这些请求,并为每个请求调用update(),并且只有在处理完所有请求后,才会实际调用repaint()。您的标签将强制为每个鼠标事件创建一个repaint()

您的标签可能比图形视图更平滑,但它将消耗更多资源,并且在有限的硬件上,当硬件尝试处理所有重绘时,标签将滞后于鼠标光标。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12522775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档