首页 > 其他分享 >自定义的Qt给统计图添加颜色样例控件

自定义的Qt给统计图添加颜色样例控件

时间:2022-11-12 04:44:06浏览次数:83  
标签:控件 Qt parent sum MColorComment temp QWidget pts 自定义

本文主要是给博文“自定义的Qt折线图控件”的图表添加颜色样例。之所以分开叙述是因为本文也是自定义控件,它不仅可以给折线图添加,还可以给其他类型的图表(柱状图、饼形图等,如果后续有这类文章的话)添加。本文代码在VS2015和Qt5.9上测试通过。此类较简单,用法是new MColorComment实例,并或然后将MPolyline设为它的父亲,再调用它的add函数向其中添加颜色和对应的文本注释就行了。默认的,该控件显示在MPolyline的上方居中位置。下面是效果图:

上代码,头文件:

class MColorComment : public QWidget
{
    Q_OBJECT

public:
    MColorComment(QWidget* parent = nullptr);
    void setParent(QWidget *parent); /* 隐藏父类方法 */
    void add(QRgb rgb, const QString& text);

private:
    void paintEvent(QPaintEvent *event) override;
    bool eventFilter(QObject *watched, QEvent *event) override;

private:
    QMultiMap<QRgb, QString> comments;
};

CPP文件:

MColorComment::MColorComment(QWidget* parent) : 
    QWidget(parent)
{
    if (parent)
    {
        parent->installEventFilter(this);
    }
}

void MColorComment::setParent(QWidget *parent)
{
    QObject* old = this->parent();
    if (old)
    {
        removeEventFilter(old);
    }
    QWidget::setParent(parent);
    if (parent)
    {
        parent->installEventFilter(this);
    }
}

void MColorComment::add(QRgb rgb, const QString& text)
{
    comments.insert(rgb, text);
    update();
}

void MColorComment::paintEvent(QPaintEvent *event)
{
    const int pad1 = 2; /* 色块和文字之间间距 */
    const int pad2 = 10; /* 文字后的留白 */
    const QSize colorBlock(10, 8);
    QPainter painter(this);
    QFontMetrics fm = painter.fontMetrics();
    int sum = 0;
    for (const auto& str : comments.values())
    {
        QSize strsz = fm.size(0, str);
        sum += colorBlock.width();
        sum += pad1;
        sum += strsz.width();
        sum += pad2;
    }
    sum -= pad2; /* 结尾多加的 */

    int xpos = (width() - sum) / 2;
    for (auto it = comments.begin(); it != comments.end(); it++)
    {
        QRect temp;
        temp.setX(xpos);
        temp.setY((height() - colorBlock.height()) / 2);
        temp.setSize(colorBlock);
        painter.fillRect(temp, QColor(it.key()));
        xpos += colorBlock.width();
        xpos += pad1;
        QSize itsz = fm.size(0, it.value());
        temp.setX(xpos);
        temp.setY((height() - itsz.height()) / 2);
        temp.setSize(itsz);
        painter.drawText(temp, it.value());
        xpos += itsz.width();
        xpos += pad2;
    }
}

bool MColorComment::eventFilter(QObject *watched, QEvent *event)
{
    QWidget* p = dynamic_cast<QWidget*>(watched);
    if (event->type() == QEvent::Resize)
    {
        setFixedSize(p->width(), 20);
    }
    return false;
}

下面给出主窗口构造函数中设置折线图和它的颜色样例的例子。代码中ui.poLines是折线图(MPolyline*):

QtTest::QtTest(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    ...

    qsrand((int)time(0));
    MColorComment* comment = new MColorComment();
    comment->setParent(ui.poLines);
    for (int i = 0; i < 2; i++)
    {
        QVector<QPointF> pts;
        for (int j = 0; j < 10; j++)
        {
            pts.push_back(QPointF(qrand() % 200 - 10, qrand() % 100));
        }
        std::sort(pts.begin(), pts.end(), [](QPointF a, QPointF b) { return a.x() < b.x(); });
        std::for_each(pts.begin(), pts.end(), [](QPointF& x) { return x *= 1; });
        QRgb color = ui.poLines->append(pts);
        comment->add(color, QString(u8"颜色%1").arg(i));
    }

    ...

}

 

标签:控件,Qt,parent,sum,MColorComment,temp,QWidget,pts,自定义
From: https://www.cnblogs.com/mengxiangdu/p/16882621.html

相关文章

  • nuxtjs3 学习踩坑1 自定义路由的配置
    刚安装的nuxt框架搭配vue3使用路由的时候除了按照约定的规则配置路由以外,还可以使用基于vue-router写法的路由文件去做配置,需要如图所示的位置编写文件:其中这样的路由要......
  • meven怎么自定义配置
    今天导入一个es模块要求用7.4.2但是里面有个文件一直是6.4.3 然后我去maven仓库下载还是不行,,最后我直接依赖锁定  强制锁定  成功......
  • 自定义的Qt折线图控件
    可以在QWidget内绘制折线图。做的比较简单,因为从写到调试只用了大概1天时间。不太智能,但是可以应对一般的场景。在VS2015和Qt5.9上测试可以使用。当然,由于测试不到位里面可......
  • MQTT Qos
    MQTTQos等级MQTT设计了一套保证消息稳定传输的机制,包括消息应答、存储和重传。在这套机制下,提供了三种不同层次QoS(QualityofService):Qos0:最多发送一次发送端发......
  • vue element 表单自定义效验 及 单独效验某个值
    主要功能 (表单自定义效验 && 单独效验某个值)表单自定义效验exportdefault{data(){//定义效验constvalidatePersonCharge=(rul......
  • 搭建一元一次线性回归方程(自定义类)
    创建了数据集x和y,通过自定义模型,创建忧化函数,损失函数,通过大量训练能过得出预测的y值,当x=4时>>>7.9998和真实的y=8十分接近。importtorchfromtorchimportnnfrom......
  • Visual Studio添加自定义代码片段
    参考:https://blog.csdn.net/baozi141990/article/details/119274426VisualStudio添加自定义代码片段创建代码片段代码片段模板创建代码片段导入代码片段Descrip......
  • PHP中获取不到自定义header参数解决方案
    一、概述今天在通过PHP中获取自定义header参数时候,一直获取不到。比如,获取header中USER_NAME参数,如下:123$curUser = isset($_SERVER['USER_NAME']) ? $_SERVER['USE......
  • Android开发技巧四--圆角化控件,让它看起来更美
    当需要为应用程序UI控件选择背景的时候,开发者会添加自定义的颜色和形状来代替系统的默认样式,圆角边框看起来是很不错的效果,开发者只需要添加几行代码,就可以在应用程序中使用......
  • 【实操日记】使用 PyQt5 设计下载远程服务器日志文件程序
    最近通过PyQt5设计了一个下载服务器指定日期日志文件的程序,里面有些有意思的技术点,现在做一些分享。PyQt5是一套Python绑定DigiaQt5应用的框架,是最强大的GUI库......