在QT选项卡中设置文本轮廓样式

时间:2011-09-20 21:35:41

标签: qt text tabs stylesheet outline

当我切换系统主题时,我发现主题标签中的文本具有我不想要的轮廓的主题。 ¿

我无法用任何方式设计轮廓并使其消失,因此标签文本看起来会更清晰。

这可能吗?我已经尝试使用outline: 0;的样式表,但没有任何反应。

也许重新实现油漆事件?但不知道这样做的确切代码。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

我正在浏览qt-sources,我认为你描述的是一个焦点矩形。只有当标签栏具有焦点(或者它的行为方式不同?)时,它才应该可见。删除它会让用户感到困惑,因为当在窗口中滚动选项卡时他不会看到当前关注的小部件。使标签栏完全不集中可能是一种解决方案,但用户将无法通过键盘更改标签。

如果你真的想删除它,我建议继承QProxyStyle,并重新实现drawPrimitive方法,所以对于QStyle :: PE_FrameFocusRect它没有做任何事情,而对于其他元素调用QProxyStyle :: drawPrimitive。

编辑:

我测试了这种方法,它没有用 - 当我有一刻我将试图找出原因。

EDIT2:

经过长时间的调查,我弄清楚为什么QStyle :: PE_FrameFocusRect不起作用。看起来焦点矩形是直接按样式绘制的,完全绕过代理样式。最小的可重新实现的代码是用于CE_TabBarTabLabel元素的drawPrimitve,但它需要自己绘制标签的标签,这实际上不应该在多风格环境中完成,所以这不是可行的方法。

在进一步检查CleanLooks风格的代码之后(我似乎没有提到Ambiance - 或者我在这里犯了愚蠢的错误?)我确信qt设计师不允许这样的手术方式 - 如果风格想要要画一个框架,没有什么可以阻止它。

使用调色板颜色使这样的框架“融入”几乎是不可能的,因为其他样式可能会以不同的方式解释这些值,从而导致更糟糕的外观。 Cleanlooks几乎消除了调色板按钮颜色中使用的所有颜色,而且版本更暗(或更亮),所以即使是一种风格也不可能。

我还试图看看我是否可以使用qt-stylesheet引擎摆脱这个框架,但无论我使用什么样式表,框架仍然绘制而没有明显的变化。在再次查看int qt源代码后,结果发现绘制此框架的代码是样式表 - 不知道。

我发现工作得很好的唯一方法是欺骗风格,以为所绘制的标签根本不集中。我想出的代码是:

class myStyle: public QProxyStyle{
public:
    myStyle(QStyle* baseStyle)
        :QProxyStyle(baseStyle){}

    virtual void drawControl ( ControlElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0 ) const{

        if (element == CE_TabBarTabLabel){
            if (const QStyleOptionTab *tb = qstyleoption_cast<const QStyleOptionTab *>(option)) {
                if (tb->state & State_HasFocus){
                    QStyleOptionTab t(*tb);
                    t.state = t.state^State_HasFocus;
                    QProxyStyle::drawControl(element, &t, painter, widget);
                    return;
                }
            }
        }
        QProxyStyle::drawControl(element, option, painter, widget);
    }
};

在tabBar()窗口小部件上设置此类样式会导致使用正确的样式,并且绘制的选项卡没有任何焦点矩形。 tabBar()是受保护的方法,因此您需要创建类inherinig QTabWidget。

虽然这个解决方案有效,但它不能称为漂亮。通过提供虚假信息,这是作弊风格。我不认为它会导致一些丑陋的文物,因为小部件只是像往常一样(非聚焦)。但是,用户通常希望看到键盘焦点的实际位置(特别是如果所有其他应用程序都在选项卡上显示),所以它可能会让人感到困惑。如果我选择的话,我宁愿选择相处而不是看起来。

正如我在答案的第一部分(编辑之前)中所写,您还可以在选项卡小部件上调用setFocusPolicy(Qt :: NoFocus),因此它根本不接受焦点。它可能甚至被推荐,例如。如果您的标签位于停靠在主窗口的停靠窗口小部件中。