• Qt去掉treeview项的焦点虚线


    项目做到后期,进行局部美化的时候发现了问题,在treeview框选择状态下会有虚线。

    其实,不仅是treeview,tableview,listview,乃至button在有焦点的情况下,都会出现虚线框,不是很美观


    网上给出的方案也是很多,最普遍的建议是,将焦点取消:

    setFocusPolicy(Qt::NoFocus); // 去除item选中时的虚线边框

    但是,这个对于我们的项目来说是不行的,因为我们得到获取焦点的位置,才能实现很多功能。

    所以,再找了一下,找到了2个方案:

    1、使用QItemDelegate子类 

    #include "no_focus_delegate.h"
    void NoFocusDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const
    {
    QStyleOptionViewItem itemOption(option);
    if (itemOption.state & QStyle::State_HasFocus)
    {
    itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
    }
    QStyledItemDelegate::paint(painter, itemOption, index);
    }
    (2)表格构造中添加如下代码
    table_widget->setItemDelegate(new NoFocusDelegate());

    结果是,虚线没了,样式也没了



    2、使用QStyle子类 

    这个方法的作用原理和第一种方法基本一致, 因为QItemDelegate的drawFocus函数调用QStyle的drawPrimitive虚函数去做实际的绘制, 所以如果我们重新定义这个绘制过程能达到同样的效果。 drawPrimitive函数负责绘制非常基本的界面元素, 根据传入的参数判断需要绘制的元素, 具体到本例就是要针对PE_FrameFocusRect元素做特殊处理。 例子代码如下:

    class NoFocusRectangleStyle: public QCommonStyle
    {
    public:
    ...
    void NoFocusRectangleStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,
    QPainter *painter, const QWidget *widget) const
    {
    if (QStyle::PE_FrameFocusRect == element )
    return;
    else
    QCommonStyle::drawPrimitive(element, option, painter,
    widget);
    }
    };

    结果是可行的!


  • 相关阅读:
    网络规划和布线
    网络编程
    NoSQL 非关系数据库
    OpenCV
    首页
    C++关键字
    TCP/IP 详解7 Ping指令
    TCP详解 (1)
    GRE封装解封装过程
    GRE tunnel
  • 原文地址:https://www.cnblogs.com/voidsky/p/5373939.html
Copyright © 2020-2023  润新知