Стилизация QTabWidget

У меня есть QTabWidget с фоновым градиентом и двумя проблемами.

  1. Как удалить мешающий контур вокруг активной вкладки (см. изображение)? Я попробовал «контур: нет», как с кнопками, но, похоже, это не дало эффекта.

  2. Как оформить отключенные вкладки? Я пробовал :disabled и :!enabled, но оба не работают. // Изменить: работает с :disabled, но не со всеми свойствами. Кажется, я пробовал только неподдерживаемый.

Отсутствующий фокус

Документация qt не помогла. Гугл тоже. :-(


person Oliver    schedule 06.11.2012    source источник


Ответы (3)


Кажется, что прямоугольник фокуса обрабатывается 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());

Это должно позволить вашим таблицам стилей продолжать работать.

Было бы неплохо, если бы был более простой способ сделать это, но я не смог его найти :)

person Arnold Spence    schedule 06.11.2012
comment
Спасибо за ваш ответ! Есть ли способ сделать это без привязки к определенному стилю, поскольку я использую статическую сборку qt для Linux/Mac и Windows, и это дает мне много ошибок? - person Oliver; 06.11.2012
comment
Необходимость указать конкретный подкласс стиля — одна из причин, по которой это решение не является оптимальным. Я не уверен, как это связано с любыми ошибками, которые вы можете получить. Какие ошибки? - person Arnold Spence; 06.11.2012

Этот поток старый, но, возможно, это поможет людям.

Если вам не нужно использовать фокус, вы можете просто установить его через виджет вкладки:

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

person vmichele    schedule 03.04.2015

Прямоугольник фокуса можно удалить, добавив фрагмент ниже к вашему стилю:

QWidget {
    outline: 0;
}

Это не связано напрямую со стилем QTabWidget, но работает так, как вы ожидаете.

person maly216    schedule 07.01.2015