QTabWidget的样式设计

4
我有一个带有渐变背景的QTabWidget,并且遇到两个问题。
  1. 如何删除活动选项卡周围令人烦恼的轮廓线(见图像)?我尝试了"outline:none",就像使用推按钮一样,但似乎没有效果。

  2. 如何为禁用的选项卡设置样式?我尝试了:disabled和:!enabled,但都不起作用。//编辑:这可以使用:disabled,但不适用于所有属性。看起来我尝试了唯一不支持的东西。

Anoying focus

QT文档无助于解决这个问题。Google也是如此。 :-(

3个回答

2
似乎焦点矩形是由正在使用的QStyle(不要与样式表混淆)处理的。您可以编写一个QStyle子类并将其应用于您的QTabWidget。该子类应覆盖drawControl()方法,并在当前绘制焦点矩形时不执行任何操作。
该子类应该类似于以下内容:
NoFocusRectStyle.h
#ifndef NOFOCUSRECTSTYLE_H
#define NOFOCUSRECTSTYLE_H

#include <QWindowsVistaStyle> // or the QStyle subclass of your choice

class NoFocusRectStyle : public QWindowsVistaStyle
{
public:
    NoFocusRectStyle();

protected:
    void drawControl(ControlElement element, const QStyleOption *option, 
        QPainter *painter, const QWidget *widget = 0) const;
};

#endif // NOFOCUSRECTSTYLE_H

NoFocusRectStyle.cpp

#include "NoFocusStyle.h"

NoFocusRectStyle::NoFocusRectStyle()
{
}

void NoFocusRectStyle::drawControl(ControlElement element, 
    const QStyleOption *option, QPainter *painter, 
    const QWidget *widget) const
{
    if(element == CE_FocusFrame)
        return;

    QWindowsVistaStyle::drawControl(element, option, painter, widget);
}

在表单的初始化程序/构造函数中,您需要将自定义样式子类应用于选项卡小部件:
ui->tabWidget->setStyle(new NoFocusRectStyle());

这应该可以让您的样式表继续正常工作。

如果有更简单的方法就好了,但是我找不到 :)


谢谢您的回复!有没有一种方法可以在没有特定样式的参考下完成这个操作,因为我在Linux/Mac和Windows上使用静态构建的Qt,它会给我带来很多错误? - Oliver
需要指定特定的样式子类是这种解决方案不理想的原因之一。但我不确定它与您可能遇到的任何错误有何关系。什么错误? - Arnold Spence

2

这个帖子虽然有些旧,但或许对人们有所帮助。

如果你不需要使用焦点,那么你可以通过标签窗口进行设置:

ui->tabWidget->setFocusPolicy(Qt::NoFocus);


1

如果您想移除焦点矩形,可以将以下代码添加到您的样式表中:

QWidget {
    outline: 0;
}

这与QTabWidget的样式无直接关系,但可以按照您的期望工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接