在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 = *(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类?请注意,图像中的变化非常小并占用了不大的时间,这是整个像素图的重绘,这非常耗时。由于我事先并不知道我将在何处进行更改,因此将像素图分割为多个小标签会非常复杂。
答案 0 :(得分:1)
如果您使用的是大型QLabel,那么使用QGraphicsScene和QGraphicsView会更好。
场景允许您添加项目,视图是一个小部件,就像一个看着场景的窗口。
您可以先添加QGraphicsPixmapItem,但我认为您最好从QGraphicsItem派生,存储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;
}
在绘画功能中,使用QPainter绘制m_pixmap;