Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何有效地更改非常大的QPixmap中非常小的一部分?_Qt_Graphics - Fatal编程技术网

Qt 如何有效地更改非常大的QPixmap中非常小的一部分?

Qt 如何有效地更改非常大的QPixmap中非常小的一部分?,qt,graphics,Qt,Graphics,在Qt中绘制小部件很简单。首先创建一个QPixmap,为其指定一个QPainter,使用QPainter绘制,最后将pixmap设置为小部件。 比如说, QPixmap pixmap(ui->label->width(), ui->label->height()); pixmap.fill(background_color); QPainter painter(&pixmap) painter.setpen(foreground_color); //painter

在Qt中绘制小部件很简单。首先创建一个QPixmap,为其指定一个QPainter,使用QPainter绘制,最后将pixmap设置为小部件。 比如说,

QPixmap pixmap(ui->label->width(), ui->label->height());
pixmap.fill(background_color);
QPainter painter(&pixmap)
painter.setpen(foreground_color);
//painter.drawLine(....) etc.
ui->label->setPixmap(pixmap);
到目前为止还不错

但是,如果pixmap非常大,并且我必须经常更改它的一小部分,该怎么办?在我的情况下,我把它描绘成我的瓶颈。我们可以加载现有的pixmap,只对其进行必要的更改,而不是创建新的pixmap并将旧的pixmap复制到其中。然而,它仍然非常缓慢

Pixmap pixmap = *(ui->label->pixmap());  // takes almost zero time
QPainter painter(&pixmap);               // takes up 40% of the time
//draw stuff with painter                // takes almost zero time
ui->label->setPixmap(pixmap);            // takes up 60% of the time
即使我重复使用画师,这样就不必每次都重新创建它,我仍然必须调用
setPixMap(pixmap)
,否则图像不会刷新

有办法绕过它吗


我必须嵌入一个OpenGL窗口或类似的东西吗,或者有没有办法只使用本机Qt类?请注意,图像中的更改非常小,并且占用的时间不多,这是整个pixmap的重绘,这非常耗时。由于我事先不知道将在何处进行更改,因此将pixmap拆分为多个小标签将非常复杂。

如果使用大型QLabel,则最好使用and

场景允许您添加项目,而视图是一个小部件,类似于一个观察场景的窗口

您可以从添加一个开始,但我认为您最好从导出、存储QPixmap并在其绘制功能中渲染图像

下面是一个派生类头的示例

class MyImage : public QGraphicsItem
{
    public:
        MyImage(QGraphicsItem* parent);

        QRectF boundingRect();

        void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0);

     protected:
         void QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent * event)

     private:
         QPixmap m_pixmap;
}

在paint功能中,使用QPaint绘制m_pixmap

是的,但是如何“对图像进行必要的更改并将其设置在标签上”?请看一下我的时间测量。绘画本身几乎不需要任何时间,而“在标签上设置”几乎占用了所有的时间;不要这样做。不,我没有在
paint()
函数中设置它。我没有从标签派生任何类,也没有重载它的绘画功能。我只有一个函数,每当一个事件迫使我进行更改时,它就会被调用。我的意思是只更新图像的一部分,
setPixmap
即使只更改了一个像素,也会更新整个图像。您响应的事件是什么?这是在实际层顶部的不可见层上的鼠标按下事件。由于pixmap占据了我的整个屏幕(甚至更多,需要滚动),重新绘制它可能需要100毫秒以上的时间,这会带来明显的延迟。请用您正在做的更多信息更新问题。事实上,我们只能做出假设,我们已经确定这些假设是不正确的。@TheDarkKnight:你对什么信息感兴趣?我的问题是调用
setPixmap
可能需要数百毫秒,即使我只更改了pixmap中的几个像素,我正在寻找一种方法来刷新显示的图像,或者不调用setPixmap,或者以任何其他不应该花费那么多时间的方式。问题不一定是何时以及多久需要更改,但单个更新时间本身就是一个问题。