Стилизация текстового контура во вкладках QT - PullRequest
2 голосов
/ 21 сентября 2011

Когда я переключаю системные темы, я нахожу темы, в которых текст имеет нежелательный контур, для активных вкладок.100

Я не могу придумать, как оформить контур и заставить его исчезнуть, чтобы текст вкладок выглядел чище.

Этовозможный?Я уже пробовал с таблицами стилей, используя outline: 0;, и ничего не происходит.

Возможно, переопределить событие рисования?но понятия не имею о точном коде, чтобы сделать это.Любая помощь приветствуется.

1 Ответ

1 голос
/ 10 октября 2011

Я просматривал qt-источники, и я думаю, что вы описываете прямоугольник фокуса.Это должно быть видно только в том случае, если панель вкладок имеет фокус (или она ведет себя по-другому?).Удаление этого было бы непонятным для пользователя, так как он не будет видеть текущий фокусированный виджет при прокрутке табуляции через окно.Решением может быть вообще не фокусировка панели вкладок, но тогда пользователь потеряет возможность менять вкладки с помощью клавиатуры.

Если вы действительно хотите удалить ее, я бы предложил создать подкласс QProxyStyle и переопределить метод drawPrimitiveпоэтому для QStyle :: PE_FrameFocusRect он ничего не делает, а для других элементов вызывает QProxyStyle :: drawPrimitive.

EDIT:

Я протестировал этот подход, и он не работал -когда у меня будет время, я попытаюсь выяснить, почему.

EDIT2:

После долгих исследований я выяснил, почему QStyle :: PE_FrameFocusRect не работает.Похоже, что прямоугольник фокуса рисуется стилем напрямую, полностью минуя стили прокси.Наименьший повторно реализуемый код - это drawPrimitve для элемента CE_TabBarTabLabel, но он требует самостоятельной рисования меток вкладки, что на самом деле не следует делать в мультистильной среде, так что это не тот путь, по которому можно пойти.

После дальнейшего изучения кодадля стиля 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 () - это защищенный метод, поэтому вам нужно создать наследование класса QTabWidget.

Пока это решение работает, его нельзя назвать симпатичным.Это обман стиль, предоставляя ложную информацию.Я не думаю, что это приведет к некоторым уродливым артефактам, поскольку виджет просто рисует сам, как обычно (не сфокусированный).Тем не менее, пользователь обычно ожидает увидеть фокус клавиатуры (особенно если все другие приложения показывают его на вкладках), поэтому это может сбить с толку.Если бы мне пришлось выбирать, я бы предпочел согласованность, а не внешний вид.

Как я уже писал в первой части моего ответа (до правок), вы также можете вызвать setFocusPolicy (Qt :: NoFocus) в виджете со вкладкамитак что он просто не принимает фокус вообще.Это может быть даже рекомендовано, например.если ваши вкладки находятся в док-виджетах, прикрепленных к главному окну.

...