解决QGraphicsView中橡皮筋风格_ce_rubberband-程序员宅基地

技术标签: Qt  qt  

#ifndef RUBBERBANDSTYLE_H
#define RUBBERBANDSTYLE_H

#include <QBrush>
#include <QPainter>
#include <QPen>
#include <QProxyStyle>
#include <QRect>
#include <QStyleOptionRubberBand>

class RubberbandStyle : public QProxyStyle
{
    typedef QProxyStyle base_type;

public:
    RubberbandStyle(const QPen& pen, const QBrush& brush, QStyle* style = nullptr)
        : QProxyStyle(style)
        , pen_(pen)
        , brush_(brush)
    {
    }

    ~RubberbandStyle() override
    {
    }

    void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget = nullptr) const override
    {
        if (CE_RubberBand == element)
        {
            painter->save();
            painter->setPen(pen_);
            painter->setBrush(brush_);
            painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
            painter->restore();
            return;
        }

        base_type::drawControl(element, option, painter, widget);
    }

private:
    QPen pen_;
    QBrush brush_;
};

使用方式

    //橡皮筋的风格设置 ********************************
    QPen pen(QBrush(Qt::red), 0, Qt::DotLine);
    QBrush brush(Qt::transparent);
    auto rubberbandStyle = new RubberbandStyle(pen, brush, nullptr);
    rubberbandStyle->setParent(this);
    viewport()->setStyle(rubberbandStyle);
    //橡皮筋的风格设置 ********************************

源码分析:QGraphicsView的paintEvent中:

#if QT_CONFIG(rubberband)
    // Rubberband
    if (d->rubberBanding && !d->rubberBandRect.isEmpty()) {
        painter.restore();
        QStyleOptionRubberBand option;
        option.initFrom(viewport());
        option.rect = d->rubberBandRect;
        option.shape = QRubberBand::Rectangle;

        QStyleHintReturnMask mask;
        if (viewport()->style()->styleHint(QStyle::SH_RubberBand_Mask, &option, viewport(), &mask)) {
            // painter clipping for masked rubberbands
            painter.setClipRegion(mask.region, Qt::IntersectClip);
        }

        viewport()->style()->drawControl(QStyle::CE_RubberBand, &option, &painter, viewport());
    }
#endif

QWindowsXPStyle::drawControl中的源码:

#if QT_CONFIG(rubberband)
    case CE_RubberBand:
        if (qstyleoption_cast<const QStyleOptionRubberBand *>(option)) {
            QColor highlight = option->palette.color(QPalette::Active, QPalette::Highlight);
            p->save();
            p->setPen(highlight.darker(120));
            QColor dimHighlight(qMin(highlight.red()/2 + 110, 255),
                                qMin(highlight.green()/2 + 110, 255),
                                qMin(highlight.blue()/2 + 110, 255),
                                (widget && widget->isTopLevel())? 255 : 127);
            p->setBrush(dimHighlight);
            p->drawRect(option->rect.adjusted(0, 0, -1, -1));
            p->restore();
            return;
        }
        break;
#endif // QT_CONFIG(rubberband)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yezishuang/article/details/123007516

智能推荐

搜索引擎技术原理及其应用-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏4次。搜索引擎技术原理及其应用WEB——浅谈GOOGLE和BAIDU搜索技术2004级计算机科学与技术三班 刘xx本文将分为以下几部分阐述一、Web搜索引擎技术综述二、Google技术三、百度技术四、结束语 搜索引擎(search engine)是指根据一定的策略、运用特定的计算机程序搜集互联网上的信息,在对信息进行组织和处理后,为用户提供检索服务的系统。一、 Web搜索引擎技术..._什么是搜索技术,搜索技术有哪些应用,搜索引擎

【转载】TRACE请求引起的反射型XSS漏洞_允许trace请求的风险-程序员宅基地

文章浏览阅读746次。原文链接:https://www.cnblogs.com/gaopei/p/11380349.htmlTRACE请求引起的反射型XSS漏洞HTTP定义了一组请求方法,以表明要对给定资源执行的操作。指示针对给定资源要执行的期望动作。 虽然他们也可以是名词, 但这些请求方法有时被称为HTTP动词. 每一个请求方法都实现了不同的语义。其中,TRACE方法沿着到目标资源的路径执行一个消息环回测试。关于TRACE方法客户端发起一个请求时,这个请求可能要穿过防火墙、代理、网关或其他一些应用程序。每个中间节点都可_允许trace请求的风险

富斯i6接收机及PPM编码器​​​​​​​接线_富斯ia6b接收机说明书-程序员宅基地

文章浏览阅读1.1w次。没有完成发射机和接收机对码,则需要按照如下过程对码: 1.将对码线连接到接收机上的B/VCC接口。 2.将电源线连接到接收机上任意其他接口。 3.打开发射机电源,同时常按发射机“BINDKEY“键,进入对码状态。 4.将对码线和电源从接收机上断开,然后重新将电源线连接到B/VCC接口。 5.检查发射..._富斯ia6b接收机说明书

AD软件系统参数的一些基本设置(Altium Designer 20 19(入门到精通全38集)四层板智能车PCB设计视频教程AD19 AD20 凡亿)_ad软件中track是什么-程序员宅基地

文章浏览阅读1.7w次,点赞26次,收藏160次。AD软件系统参数的一些基本设置(Altium Designer 20 19(入门到精通全38集)四层板智能车PCB设计视频教程AD19 AD20 凡亿)_ad软件中track是什么

模糊测试简介_模糊测试测试用例生成的目的-程序员宅基地

文章浏览阅读2.7k次。转载自:CTF ALL IN ONE基本原理模糊测试(fuzzing)是一种通过向程序提供非预期的输入并监控输出中的异常来发现软件中的故障的方法。用于模糊测试的模糊测试器(fuzzer)分为两类:一类是基于变异的模糊测试器,它通过对已有的数据样本进行变异来创建测试用例另一类是基于生成的模糊测试器,它为被测试系统使用的协议或文件格式建模,基于模型生成输入并据此创建测试用例。模糊测试流程模糊测试通常包含下面几个基本阶段:确定测试目标:确定目标程序的性质、功能、运行条件和环境、编写程序的语言_模糊测试测试用例生成的目的

2020-09-02刷题_02题: a=["hanjiang",2020,"09",25,"normal","universi-程序员宅基地

文章浏览阅读69次。大数加法概述:很多时候在进行大数运算时,也就是可能成百位的数字进行加法时,int甚至long 都无法运算,那么我们可以用字符串代替。代码:#include <iostream>#include <string>using namespace std;string GetSum(string str1,string str2){ //挑选较大的数,作为进位的数 if(str1.size() < str2.size()) { string temp = ._02题: a=["hanjiang",2020,"09",25,"normal","university"] 1、将列表中第三到五

随便推点

饿了么element滚动条elScrollbar的使用(包含在el-table中的使用)_el-table中使用el-scrollbar-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏23次。饿了么element滚动条elScrollbar的使用(包含在el-table中的使用)简介引用基本使用只显示横向滚动条只显示纵向滚动条在el-table中使用滚动条简介由于项目需要统一滚动条样式有需要兼容ie,之前有用过一款滚动条插件,但是有点儿卡,而且数据更新需要自己重置,又刚好在elment官网看到了饿了么自带的滚动条样式比较友好,就想把他扣下来,搜索之后原来element-ui有这个滚动条的组件,只是文档里面没有,经使用验证可以兼容到ie10,而且可以很好的DIY样式,更不用每次更新数据就需要重_el-table中使用el-scrollbar

关于git rebase的操作解决 push时被拒绝,整体流程_git push rebase-程序员宅基地

文章浏览阅读8.6k次,点赞4次,收藏13次。git提交远程仓库常规的操作流程: git add . (.是提交所有已更改文件,也可以只提交一个文件,在add 后面写上添加修改文件的名字就可以了,如果想要放弃添加过的文件的话,使用 git checkout . 放弃本地所有的修改) git commit -m"XXX" git pull --rebase (主干分支) == git fetch + git rebase git push (自己的远程分支) 注意:使用git log --oneline --g._git push rebase

金融行业相关知识点整理_金融安全相关知识点csdn-程序员宅基地

文章浏览阅读910次。金融行业相关知识点整理开放式理财产品国有控股商业银行股份制商业银行非保本浮动收益SHIBOR标准化债权类资产封闭式基金开放式基金基金存续期有哪些因素影响基金存续期?理财产品和基金的区别整理一下日常工作中遇到的金融行业相关知识点,会将不太了解的名词解释整理在这个文档中,大部分是百度复制来的,小部分是自己整合的各渠道的知识,如有纰漏欢迎指正~开放式理财产品开放式理财产品,是指在每个法定工作日、规定的交易时间内,可以进行申购或赎回的理财产品。在投资过程中,如果想赎回资金,随时都可以。反之,如果想继续申购,也_金融安全相关知识点csdn

win10 mx450 安装anaconda3+cuda+cudnn+tensorflow2.1_mx450是不是就是支持cuda cudnn-程序员宅基地

文章浏览阅读6k次,点赞6次,收藏27次。电脑上没有python环境1anaconda3的下载,注意32位和64位的别选错了图形化界面安装,中间可以选择安装位置,路径中不能出现中文之后有一个Advance Options,如下图,默认不勾选第一个添加环境变量,就不要勾选了,待会儿手动添加就行了然后就安装好了配置环境变量将安装目录下的三个路径添加到path环境变量中,Anaconda路径(conda命令),scripts(python命令),Library\bin(anaconda管理的第三方包),三个都添加就可以在命_mx450是不是就是支持cuda cudnn

OpenStack之Nova分析——Nova Compute定时任务(一)_nova compute定时任务有哪些-程序员宅基地

文章浏览阅读2.5k次。我们在分析虚拟机的创建和Nova Scheduler调度算法中,其实已经涉及到了Nova Compute服务的一些内容,不过Nova Compute服务完成的工作要更多。这篇文章我们来详细的分析一下Nova Compute服务的一个重要内容——定时任务。在前面分析Nova Scheduler调度算法中,大家是否还记得在HostManager对象中有两个重要的变量:1. host_state_nova compute定时任务有哪些

什么是ASP.NET Core 2.0?ASP.NET Core 2.0如何跨平台?_.net core2.0跨平台-程序员宅基地

文章浏览阅读1.3k次。什么是ASP.NET Core 2.0 为什么要使用 ASP.NET Core?NET Core 刚发布的时候根据介绍就有点心里痒痒, 大概看了一下没敢付诸于行动, 现在2.0发布了一段时间了, 之前对其"不稳定"的顾虑也打消的差不多了,决定踏实的研究一下.至于为什么要使用core, 官方是这样说的:ASP.NET Core 是重新设计的 ASP.NET,更改了体系结构..._.net core2.0跨平台