zoukankan      html  css  js  c++  java
  • 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);
    }
    };

    结果是可行的!


  • 相关阅读:
    4.异常捕获后再次抛出
    图像滤镜处理算法:灰度、黑白、底片、浮雕
    JAVA层和JNI层实现Bitmap图镜像功能。
    关于ARGB_8888、ALPHA_8、ARGB_4444、RGB_565的理解
    镜象变换的源代码
    android 图像处理(黑白,模糊,浮雕,圆角,镜像,底片,油画,灰白,加旧,哈哈镜,放大镜)
    android获取项目下的一张图片的绝对路径问题以及解决方法
    fwrite用法
    关于毁灭地球
    memset,memcpy
  • 原文地址:https://www.cnblogs.com/voidsky/p/5373939.html
Copyright © 2011-2022 走看看