QT去除控件被选中后的焦点虚线框

一、参考资料

二、写在前面的废话
焦点虚线框可以让我们很清楚的了解到当前被选中的按钮是哪个,但是有时候却会影响我们辛苦设计的界面的美观性,这时候就想去除焦点虚线框,今天在改的tabWidget时就遇到了这个问题,经过了三四个小时的斗争终于解决,记录一下.

三、解决
在网上找到了两种解决方法(原文链接已赋在前方):

  • 1.用qss,一句话搞定;
  • 2.再写一个类,然后应用到main函数里.

两种方法在我的项目中效果不同,这里都记录一下:

1.用qss,一句话搞定

在qss文件中加上下面这行代码(下面号外里有怎么新建qss文件并调用)

QWidget:focus{outline: none;}  /*remove all  QWidget's focus border*/

只有一行,感觉很神奇,上面是对QWidget做的限制,如果你想对按钮或者输入框做限制,换成相应的QPushButton,QLineEdit即可.

或者用下面的这行也可以

QPushButton:focus{padding: -1;} // 具体负多少可以调节 

项目应用:这种方法应用在我的项目里时,button的聚焦虚线框确实没有了,但是也把我整个项目的设计给毁了,同时,tabWidget控件的虚线框也没去掉,所以,失败了

2.再写一个类,然后应用到main函数里.

然后再说自定义类的这个,也很简单的,直接上代码(号外里有稍微详细一点的解释)

#ifndef MYPROXYSTYLE_H
#define MYPROXYSTYLE_H

#include <QProxyStyle>
#include <QStyleOption>
#include <QPainter>
#include <QWidget>

//去除窗口部件的系统焦点边框;
class MyProxyStyle : public QProxyStyle
{
public:
    virtual void drawPrimitive(PrimitiveElement element, const QStyleOption * option,
        QPainter * painter, const QWidget * widget = 0) const
    {
        if (PE_FrameFocusRect == element)
        {
            //这里不做任何操作,Qt默认是绘制矩形虚线框
        }
        else
        {
            QProxyStyle::drawPrimitive(element, option,painter, widget);
        }
    }
};

#endif // MYPROXYSTYLE_H
#include "myproxystyle.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //添加style为这个工程的所有窗口都去除了矩形虚线框
    qApp->setStyle(new MyProxyStyle);
    //其他操作...
    return a.exec();
}

四、号外

1、qss文件是qt的样式文件,使用它可以将项目的功能和ui设计分离开,相互独立,比较方便,也比较直观

新建:
在项目代码文件的根目录下新建一个文件夹,起名qss
=> 在qss文件夹里新建空文档并写入样式代码
=> 将文件后缀名改为.qss(比如:myStyle.qss)
=> 在qtcreator中鼠标右击文件名
=> 添加新文件
=> 选择 Qt - Qt Resource File - choose
=> 名称随便(比如qss)
=> 下一步
=> 完成
=> 鼠标右击刚新建的qrc文件(我这里是qss.qrc)
=> 添加现有文件
=> 找到你刚新建的.qss文件(我这里是:myStyle.qss),选中
=> 打开
新建完成

调用:

#include <QFile> // 别忘了这个
QFile styleSheet(":/qss/myStyle.qss");  
if (!styleSheet.open(QIODevice::ReadOnly))  
{  
    qWarning("Can't open the style sheet file.");  
    return;  
}  
qApp->setStyleSheet(styleSheet.readAll());  

2、新建类函数

1)这里我们是重载了现有类的一个函数,对我们所需要的效果进行重新绘制,即用给定的option和painter来绘制element。

2)形参说明:
PrimitiveElement:指明想要绘制的图形元素
QStyleOption:指明想要的该图形元素的样式
QPainter:用于绘制该元素
QWidget:将被绘制的对象(这是可选的)

3)下表(译自官方文档)列出了primitive element及其关联的style option子类(Style Flag和备注里面的序号是一一对应的)。

虽然表中的大多数都看不懂,但是从这个表中我们可以发上面if语句的判断条件正是对应的第一条,也可以理解为什么那么写了

Primitive ElementQStyleOption SubclassStyle Flag备注
PE_FrameFocusRectQStyleOptionFocusRectState_FocusAtBorder焦点是在边框还是在窗口小部件内
PE_IndicatorCheckBoxQStyleOptionButton①State_NoChange ②State_On ③State_On ④State_NoChange ⑤State_Enabled①表示“三态”复选框 ②表示指示符已选中 ③表示选择了单选按钮 ④表示“三态”控制器 ⑤表示控制器已启用
PE_IndicatorBranchQStyleOption①State_Children ②State_Item ③State_Open ④State_Sibling①表示应该用于绘制展开树以显示子控件 ②表示应该用于绘制一个水平分支(以显示子控件) ③表示扩展了树分支 ④表示应该用于绘制一条垂直线(以显示同级项目)
PE_IndicatorHeaderArrowQStyleOptionHeaderState_UpArrow表示应制定箭头; 否则应该向下
PE_FrameGroupBox, PE_Frame, PE_FrameLineEdit, PE_FrameMenu, PE_FrameDockWidget, PE_FrameWindowQStyleOptionFrameState_Sunken表示框架应凹陷
PE_IndicatorToolBarHandleQStyleOptionState_Horizontal表示窗口句柄是水平的,而不是垂直的
PE_IndicatorSpinPlus, PE_IndicatorSpinMinus, PE_IndicatorSpinUp, PE_IndicatorSpinDownQStyleOptionSpinBoxState_Sunken表示按下按钮
PE_PanelButtonCommandQStyleOptionButton①State_Enabled ②State_HasFocus ③State_Raised ④State_On ⑤State_Sunken①如果按钮已启用,请设置 ②如果按钮具有输入焦点,请设置 ③如果按钮没有按下,没有启用,也不扁平,请设置 ④如果该按钮是切换按钮并且正被切换,请设置 ⑤如果按钮被按下(比如,鼠标按钮或者空格键在按钮上被按下)

翻译的不准的地方还请大家见谅,恳请批评指正,先谢过了!

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值