[英]Qt how to create bitmap from data from QVector and show it on widget?
I'm wondering how I can create bitmap from my data and show it on my widget. 我想知道如何从数据创建位图并将其显示在小部件上。
I have QVector vector, which is vector of some points to draw chart. 我有QVector向量,它是绘制图表的某些点的向量。 How I can repaint it on my widget but with using QBitmap? 如何使用QBitmap在我的窗口小部件上重绘? I don't want draw simply on widget, I prefer pass the pixmap to widget, just to show it. 我不想简单地在小部件上绘制,我更喜欢将像素图传递给小部件,只是为了显示它。
How can I do this? 我怎样才能做到这一点?
My code: 我的代码:
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);
Here is my sample code. 这是我的示例代码。 Why it's not working? 为什么不起作用? I can't see anything on widget. 我在小部件上看不到任何东西。
I have widget class 我有小部件类
class Widget : public QLabel
{
public:
Widget(QVector<QPointF> * data);
~Widget();
protected:
void paintEvent(QPaintEvent * event);
private:
QVector<QPointF> data;
QPixmap *pixMap;
};
In constructor I have 在构造函数中,我有
Widget::Widget(QVector<QPointF> * data){
pixMap = new QPixmap(300,300);
pixMap->fill(Qt::red);
}
And in paintEvent 并在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);
}
If I replace QPainter painter(pixMap)
with QPainter painter(this)
, I can see my chart. 如果我用QPainter painter(pixMap)
替换QPainter painter(pixMap)
QPainter painter(this)
,我可以看到我的图表。 But I want to use pixmap. 但是我想使用pixmap。
I think so, but I wasn't sure without full code, now I am absolutely sure. 我是这样认为的,但是我不确定没有完整的代码,现在我绝对可以确定。 You should do standard processing of paintEvent. 您应该对paintEvent进行标准处理。 So try this: 所以试试这个:
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
}
But I think that you don't need paintEvent at all, then you can totally remove paintEvent from your class or do 但是我认为您根本不需要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
}
and in constructor: 并在构造函数中:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.