请选择 进入手机版 | 继续访问电脑版

12360技术网 - 专业IT技术发表平台

 立即注册  找回密码
查看: 2297|回复: 4

QChart 鼠标移动到曲线上,显示曲线的点(已封装成dll)// Qtooltip

[复制链接]

21

主题

31

帖子

283

积分

中级会员

Rank: 3Rank: 3

积分
283
发表于 2020-1-27 04:16:20 | 显示全部楼层 |阅读模式
1、准备工作

该封装案例取自Qt chart的官方示例。
找到官方列子
如果安装了qt examples,路径如下图:

如果未安装examples,访问官方网址:https://doc.qt.io/qt-5/qtcharts-callout-example.html
2、开始封装有效代码

这边不研究源码,请自行测试,下面贴出所有代码
.cpp中
<blockquote>//.cpp
//虚函数获取区域大小
QRectF QCallout::boundingRect() const
{
    QPointF anchor = mapFromParent(m_chart->mapToPosition(m_anchor));
    QRectF rect;
    rect.setLeft(qMin(m_rect.left(), anchor.x()));
    rect.setRight(qMax(m_rect.right(), anchor.x()));
    rect.setTop(qMin(m_rect.top(), anchor.y()));
    rect.setBottom(qMax(m_rect.bottom(), anchor.y()));
    return rect;
}
//重绘
void QCallout::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option)
        Q_UNUSED(widget)
        QPainterPath path;
    path.addRoundedRect(m_rect, 5, 5); //将圆角矩形加入 路径
    QPointF anchor = mapFromParent(m_chart->mapToPosition(m_anchor));//返回图列的相对位置
    if (!m_rect.contains(anchor)) {
        QPointF point1, point2;
        // establish the position of the anchor point in relation to m_rect
        bool above = anchor.y()  m_rect.top() && anchor.y()  m_rect.center().y() && anchor.y()  m_rect.bottom();
        bool onLeft = anchor.x()  m_rect.left() && anchor.x()  m_rect.center().x() && anchor.x()  m_rect.right();
        // get the nearest m_rect corner.
        qreal x = (onRight + rightOfCenter) * m_rect.width();
        qreal y = (below + belowCenter) * m_rect.height();
        bool cornerCase = (above && onLeft) || (above && onRight) || (below && onLeft) || (below && onRight);
        bool vertical = qAbs(anchor.x() - x) > qAbs(anchor.y() - y);
        qreal x1 = x + leftOfCenter * 10 - rightOfCenter * 20 + cornerCase * !vertical * (onLeft * 10 - onRight * 20);
        qreal y1 = y + aboveCenter * 10 - belowCenter * 20 + cornerCase * vertical * (above * 10 - below * 20);;
        point1.setX(x1);
        point1.setY(y1);
        qreal x2 = x + leftOfCenter * 20 - rightOfCenter * 10 + cornerCase * !vertical * (onLeft * 20 - onRight * 10);;
        qreal y2 = y + aboveCenter * 20 - belowCenter * 10 + cornerCase * vertical * (above * 20 - below * 10);;
        point2.setX(x2);
        point2.setY(y2);
        path.moveTo(point1);
        path.lineTo(anchor);
        path.lineTo(point2);
        path = path.simplified();
    }
    painter->setBrush(rectColor);
    painter->drawPath(path);
    painter->setPen(textColor);
    painter->setFont(m_font);
    painter->drawText(m_textRect, m_text);

    // qDebug()




上一篇:我的世界 RED SUN 思路。
下一篇:使用JAVA在eclipce环境下处理xml文件
回复

使用道具 举报

0

主题

17

帖子

367

积分

中级会员

Rank: 3Rank: 3

积分
367
发表于 2020-2-4 18:03:47 | 显示全部楼层
其实我一直觉得楼主的品味不错!呵呵![www.12360.co]
回复

使用道具 举报

0

主题

13

帖子

283

积分

中级会员

Rank: 3Rank: 3

积分
283
发表于 2020-2-8 21:25:24 | 显示全部楼层
楼主太厉害了!楼主,I*老*虎*U![www.12360.co]
回复

使用道具 举报

0

主题

10

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2020-2-9 07:42:36 | 显示全部楼层
楼主,大恩不言谢了![www.12360.co]
回复

使用道具 举报

0

主题

21

帖子

451

积分

中级会员

Rank: 3Rank: 3

积分
451
发表于 4 天前 | 显示全部楼层
既然你诚信诚意的推荐了,那我就勉为其难的看看吧![www.12360.co]
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

12360技术网

GMT+8, 2020-2-29 21:24 , Processed in 0.094849 second(s), 40 queries .

本网站内容收集于互联网,Www.12360.Co不承担任何由于内容的合法性及健康性所引起的争议和法律责任。 欢迎大家对网站内容侵犯版权等不合法和不健康行为进行监督和举报。

© 2019-2020 Www.12360.Co

快速回复 返回顶部 返回列表