【问题标题】:Qt: making a stacked barchart with different colors [closed]Qt:制作不同颜色的堆叠条形图[关闭]
【发布时间】:2014-01-15 02:24:40
【问题描述】:

我正在尝试在 Qt 中制作时间线,其中不同的颜色代表不同的任务。 最终,它应该看起来有点像这样(但只有一行);

现在有人知道如何在不安装额外库的情况下做到这一点,而只需使用 QPaint? 它所代表的数据存储在自定义结构中。

欢迎任何帮助。

谢谢!

【问题讨论】:

  • 为什么不能用不同颜色或只使用(线性)渐变绘制矩形?基于您的数据结构? doc-snapshot.qt-project.org/qdoc/qpainter.html#drawRectdoc-snapshot.qt-project.org/qdoc/qpainter.html#setBrush
  • 你能告诉我们到目前为止你尝试了什么吗?
  • 你的问题有点含糊。您是否正在尝试创建新的小部件?你想在纸上打印吗?没有更多信息,唯一的建议是使用QPainter::drawRect 函数
  • 回答您的问题:我尝试创建一个新的小部件,其中包含一堆不同大小的 qlabel。我也一直在考虑为此使用 gnuplot 脚本。如果我画矩形,我能把它们放在一个固定的位置吗?

标签: c++ qt colors qpainter qtgui


【解决方案1】:

您可以继承 Qwidget,并至少重新定义 paintEvent(QPaintEvent * event)resizeEvent(QResizeEvent * event)

我假设您的小部件包含 QRectQColor 对的初始列表。当调整大小事件发生时,您使用基本的相对算术计算 QRect 的呈现列表。当绘制甚至发生时,您可以使用此渲染列表来填充颜色。

您甚至可以允许使用鼠标事件修改颜色以进行一些整洁的渲染。

所有这些都可以用 Qml 完成,而且可能更容易。

【讨论】:

    【解决方案2】:

    您似乎需要类似下面的代码,但请注意,这只是伪代码,具体细节很大程度上取决于您如何从尚未与我们共享的数据结构中获取数据。

    ...
    QPainter *painter = new QPainter(MyPaintDevice); // MyPaintDevice could be even 'this'
    QPen pen(Qt::gray, 2);
    painter->setPen(pen);
    int currentX = 0;
    const int currentY = 0;
    const int height = hardCodedValue; // Coming from some static data initialization
    
    foreach (const Settings& settings, settingsList) {
        QBrush brush(QColor(settings.colorString()));
        painter->setBrush(brush);
        painter->drawRect(currentX, currentY, settings.width(), height);
        currentX += settings.width();
    }
    ...
    

    诚然,您最好选择 QML 而不是旧的 QPainter 引擎,原因有几个。现在这是硬件加速,而不是像QPainter 方法那样的软件光栅化,但对你来说可能更重要的是:它更简单。

    您需要查看native Rect qml element,可能还有Repeater

    【讨论】:

      猜你喜欢
      • 2021-02-25
      • 1970-01-01
      • 2014-05-11
      • 2021-03-06
      • 1970-01-01
      • 2022-12-11
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多