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。 @Tata​​rinho 在你的派生类中你重新实现了paintEvent,所以在你的事件中有几行代码,但是QLabel在paintEvent中有更多的东西,如果你想使用setPixmap,你需要这些东西。所以在你的情况下 QLabel::paintEvent(e);是必要的

以上是关于Qt 如何从 QVector 中的数据创建位图并将其显示在小部件上?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Qt 访问 2D QVector 中的数据

Qt - QVector 和模型视图 - 从 listView 获取自定义类的最佳方法是啥?

qt5中QVector<double> 如何赋值

Qt6-QVector分析

多维数组的Qt QVector

如何从命名管道中获取结构化数据并将其写入 Qt 中的 qtableview