在显示Qt Widget的控件时,经常遇到控件周围有虚线框的情况,很是影响软件的美观。下面有两种方法解决这个问题。
1、设置控件的样式进行设置
QWidget:focus { outline: none; }
这种方法有时候使得控件失去样式,我们可以设置对应的控件样式为 outline:none;
2、让QApplication设置一个继承自QProxyStyle的类。
继承 QProxyStyle,QStyle::PE_FrameFocusRect 时不绘制虚线框,main() 函数里调用 QApplication::setStyle() 使用新的样式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // 文件名: NoFocusRectStyle.h #ifndef NOFOCUSRECTSTYLE_H #define NOFOCUSRECTSTYLE_H #include <QProxyStyle> class NoFocusRectStyle : public QProxyStyle { public: NoFocusRectStyle(QStyle *baseStyle) : QProxyStyle(baseStyle) {} void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const { if (element == QStyle::PE_FrameFocusRect) { return; } QProxyStyle::drawPrimitive(element, option, painter, widget); } }; #endif // NOFOCUSRECTSTYLE_H |
当 element == QStyle::PE_FrameFocusRect 时,直接返回,不绘制虚线框。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 文件名: main.cpp #include "Widget.h" #include "NoFocusRectStyle.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication app(argc, argv); NoFocusRectStyle *style = new NoFocusRectStyle(app.style()); app.setStyle(style); // Ownership of the style object is transferred to QApplication Widget w; w.show(); return app.exec(); } |
在 main() 函数中调用 app.setStyle(style) 使用我们上面自定义的 NoFocusRectStyle 就可以把虚线框去掉了。