一、参考资料
二、写在前面的废话
焦点虚线框可以让我们很清楚的了解到当前被选中的按钮是哪个,但是有时候却会影响我们辛苦设计的界面的美观性,这时候就想去除焦点虚线框,今天在改的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 Element | QStyleOption Subclass | Style Flag | 备注 |
---|---|---|---|
PE_FrameFocusRect | QStyleOptionFocusRect | State_FocusAtBorder | 焦点是在边框还是在窗口小部件内 |
PE_IndicatorCheckBox | QStyleOptionButton | ①State_NoChange ②State_On ③State_On ④State_NoChange ⑤State_Enabled | ①表示“三态”复选框 ②表示指示符已选中 ③表示选择了单选按钮 ④表示“三态”控制器 ⑤表示控制器已启用 |
PE_IndicatorBranch | QStyleOption | ①State_Children ②State_Item ③State_Open ④State_Sibling | ①表示应该用于绘制展开树以显示子控件 ②表示应该用于绘制一个水平分支(以显示子控件) ③表示扩展了树分支 ④表示应该用于绘制一条垂直线(以显示同级项目) |
PE_IndicatorHeaderArrow | QStyleOptionHeader | State_UpArrow | 表示应制定箭头; 否则应该向下 |
PE_FrameGroupBox, PE_Frame, PE_FrameLineEdit, PE_FrameMenu, PE_FrameDockWidget, PE_FrameWindow | QStyleOptionFrame | State_Sunken | 表示框架应凹陷 |
PE_IndicatorToolBarHandle | QStyleOption | State_Horizontal | 表示窗口句柄是水平的,而不是垂直的 |
PE_IndicatorSpinPlus, PE_IndicatorSpinMinus, PE_IndicatorSpinUp, PE_IndicatorSpinDown | QStyleOptionSpinBox | State_Sunken | 表示按下按钮 |
PE_PanelButtonCommand | QStyleOptionButton | ①State_Enabled ②State_HasFocus ③State_Raised ④State_On ⑤State_Sunken | ①如果按钮已启用,请设置 ②如果按钮具有输入焦点,请设置 ③如果按钮没有按下,没有启用,也不扁平,请设置 ④如果该按钮是切换按钮并且正被切换,请设置 ⑤如果按钮被按下(比如,鼠标按钮或者空格键在按钮上被按下) |
翻译的不准的地方还请大家见谅,恳请批评指正,先谢过了!