Qt 如何从 QVector 中的数据创建位图并将其显示在小部件上?
Posted
技术标签:
【中文标题】Qt 如何从 QVector 中的数据创建位图并将其显示在小部件上?【英文标题】:Qt how to create bitmap from data from QVector and show it on widget? 【发布时间】:2014-11-27 15:05:19 【问题描述】:我想知道如何从我的数据创建位图并将其显示在我的小部件上。
我有 QVector 向量,它是一些点的向量来绘制图表。如何在我的小部件上重新绘制它但使用 QBitmap?我不想简单地在小部件上绘制,我更喜欢将像素图传递给小部件,只是为了显示它。
我该怎么做?
我的代码:
QPainter painter(pixMap);
painter.setPen(QPen(Qt::black, 2));
painter.drawPolyline(this->data.data(), this->data.size());
painter.drawLine(QPointF(5,5),QPointF(50,50));
setPixmap(*pixMap);
这是我的示例代码。为什么它不起作用?我在小部件上看不到任何内容。
我有小部件类
class Widget : public QLabel
public:
Widget(QVector<QPointF> * data);
~Widget();
protected:
void paintEvent(QPaintEvent * event);
private:
QVector<QPointF> data;
QPixmap *pixMap;
;
在构造函数中我有
Widget::Widget(QVector<QPointF> * data)
pixMap = new QPixmap(300,300);
pixMap->fill(Qt::red);
在paintEvent中
void Waveform::paintEvent(QPaintEvent *event)
QPainter painter(pixMap);
painter.setPen(QPen(Qt::white, 2));
painter.drawPolyline(this->data.data(), this->data.size());
painter.drawLine(QPointF(5,5),QPointF(50,50));
setPixmap(*pixMap);
如果我用QPainter painter(this)
替换QPainter painter(pixMap)
,我可以看到我的图表。但我想使用像素图。
【问题讨论】:
QBitmap 用于遮罩等,它有 color0 和 color1,你到底想要什么,为 pixmap 创建遮罩还是只画一个图或其他什么? 我想画一个图,但不想直接在小部件上。我想以某种方式从我的数据中绘制位图,然后在 QLABEL 上显示位图。 为什么是位图?位图是2种颜色的蒙版,像素图更好,可以用不同的颜色画线和点。 QPixmap。 请看下面的代码 您的代码看起来不错,如果 data() 返回真正正确的数据,那么我的答案应该是一个解决方案,如果不是,请指出我。另外,不要添加您的代码作为答案,只需编辑您的问题(点击编辑) 【参考方案1】:我想是的,但如果没有完整的代码我不确定,现在我完全确定了。您应该对paintEvent 进行标准处理。所以试试这个:
void Waveform::paintEvent(QPaintEvent *e)
static const QPointF points[3] =
QPointF(10.0, 80.0),
QPointF(20.0, 10.0),
QPointF(80.0, 30.0),
;
QPainter painter(pixMap);
painter.setPen(QPen(Qt::black, 2));
painter.drawPolyline(points, 3);
painter.drawLine(QPointF(5,5),QPointF(50,50));
setPixmap(*pixMap);
QLabel::paintEvent(e);//standard processing
但我认为你根本不需要paintEvent,那么你可以完全从你的班级中删除paintEvent或者做
void VertLabel::paintEvent(QPaintEvent *e)
QLabel::paintEvent(e);//in this case you don't need paintEvent at all, remove it from cpp and header files
在构造函数中:
pixMap = new QPixmap(300,300);
pixMap->fill(Qt::red);
this->resize(300,300);
static const QPointF points[3] =
QPointF(10.0, 80.0),
QPointF(20.0, 10.0),
QPointF(80.0, 30.0),
;
QPainter painter(pixMap);
painter.setPen(QPen(Qt::black, 2));
painter.drawPolyline(points, 3);
painter.drawLine(QPointF(5,5),QPointF(50,50));
setPixmap(*pixMap);
【讨论】:
它没有帮助。我的小部件总是白色的,从不改变颜色。我有一个带有 QLbal 泛化的小部件。 class Widget: public QLabel 我的代码在重载的paintEvent函数中。这里有什么问题 我说的是像素图,不是小部件,显示截图,你得到了什么?黑屏,白屏,或者只是标准的小部件颜色,到底是什么? 请看上图 好吧,我认为 QLabel::paintEvent(e);耍了个花招。但为什么?如果我的 Widget 是从 QLabel 派生的,我真的不明白为什么我需要从 QLabel 调用paintEvent。 @Tatarinho 在你的派生类中你重新实现了paintEvent,所以在你的事件中有几行代码,但是QLabel在paintEvent中有更多的东西,如果你想使用setPixmap,你需要这些东西。所以在你的情况下 QLabel::paintEvent(e);是必要的以上是关于Qt 如何从 QVector 中的数据创建位图并将其显示在小部件上?的主要内容,如果未能解决你的问题,请参考以下文章