2013-07-08 5 views
1

В моем приложении у меня есть раздражающий белый прямоугольник на элементах управления tabstop. Я попытался посмотреть в таблицах стилей, но myitem: стиль tabstop ничего не делает. Есть ли способ, каким-либо образом изменить цвет tabstop/или сделать его другой формой.Qt TabStop проблемы с цветом

+0

Пожалуйста, добавьте больше деталей, описывающих проблему. Попробуйте добавить скриншот проблемы и соответствующего кода, чтобы помочь другим пользователям понять, что именно вы получаете здесь. – animuson

ответ

1

К сожалению, прямоугольник фокусировки не является чем-то, на что могут повлиять таблицы стилей. Таблицы стилей потрясающие, но, к сожалению, есть некоторые ограничения.

Существует способ избавиться от прямоугольника фокуса - here - пример того, как это сделать для кнопок. Хотя вам придется управлять этим контролем с помощью управления. В основном это делается при рендеринге управления, вы игнорируете сосредоточенное состояние и рисуете элемент управления, как если бы он не фокусировался.

Чтобы полностью изменить вид прямоугольника фокуса, я полагаю, вы можете переопределить сам примитив. Многие виджеты состоят из повторно используемых примитивов. Поэтому при создании объекта QStyle мы можем переопределить, как рисуются определенные виджеты или определенные примитивы.

Так что в вашем случае вы можете создать класс QStyle что-то вроде следующего:

class CustomStyle : public QWindowsStyle 
{ 
    Q_OBJECT 

public: 
    CustomStyle() {} 

    void drawPrimitive(PrimitiveElement which, 
         const QStyleOption *option, QPainter *painter, 
         const QWidget *widget = 0) const; 

} 

Тогда в реализации необходимо предоставить средства для рисования прямоугольника фокусировки, как вам нравится. Ниже приведена версия Windows по умолчанию.

void CustomStyle::drawPrimitive(PrimitiveElement which, 
           const QStyleOption *option, 
           QPainter *painter, 
           const QWidget *widget) const 
{ 
    switch (which) { 
    case PE_FrameFocusRect: 
     if (const QStyleOptionFocusRect *fropt = qstyleoption_cast<const QStyleOptionFocusRect *>(opt)) { 
     //### check for d->alt_down 
     if (!(fropt->state & State_KeyboardFocusChange) && !proxy()->styleHint(SH_UnderlineShortcut, opt)) 
      return; 
     QRect r = opt->rect; 
     p->save(); 
     p->setBackgroundMode(Qt::TransparentMode); 
     QColor bg_col = fropt->backgroundColor; 
     if (!bg_col.isValid()) 
      bg_col = p->background().color(); 
     // Create an "XOR" color. 
     QColor patternCol((bg_col.red()^0xff) & 0xff, 
          (bg_col.green()^0xff) & 0xff, 
          (bg_col.blue()^0xff) & 0xff); 
     p->setBrush(QBrush(patternCol, Qt::Dense4Pattern)); 
     p->setBrushOrigin(r.topLeft()); 
     p->setPen(Qt::NoPen); 
     p->drawRect(r.left(), r.top(), r.width(), 1); // Top 
     p->drawRect(r.left(), r.bottom(), r.width(), 1); // Bottom 
     p->drawRect(r.left(), r.top(), 1, r.height()); // Left 
     p->drawRect(r.right(), r.top(), 1, r.height()); // Right 
     p->restore(); 
    } 
     break; 
    default: 
     QWindowsStyle::drawPrimitive(which, option, painter, widget); 
    } 
} 

Тогда просто указать свой класс стиля для вашего приложения

QApplication::setStyle(new CustomStyle); 

Обратной стороной здесь является то, что с помощью подклассов QWindowsStyle, мы запирая приложения в окно выглядеть и чувствовать себя. Существуют и другие базовые стили, которые вы можете использовать, кроме окон один (например, QMacStyle и т. Д.), Но дело в том, что вы должны знать, что вы получаете, прежде чем идти по этой дороге.

This - хорошая статья о QStyles и о том, как использовать силу их в свою пользу.

EDIT:

Для пользователей Qt5 QWindowsStyle теперь стало частным, смотрите здесь для быстрого explanation. Но теоретически все, что можно сделать с QWindowsStyle, можно сделать с помощью нового класса QProxyStyle. Для быстрого примера см. here. Я считаю, что хорошая новость заключается в том, что вы не запираетесь на определенный базовый стиль (например, QWindowsStyle). И это хорошо.

+0

Привет, я пытался использовать это, но в конце концов я не могу найти класс QWindowsStyle. Я полагаю, что он был удален в новой версии QT. – SirLanceloaaat

+0

Вы используете Qt5? Я все еще на 4.8. *. По-прежнему существует способ сделать это с помощью QProxyStyle. Я обновляю свой ответ с помощью нескольких ссылок. – Liz

+0

Я работал с QProxyStyle. Вопрос закрыт. – SirLanceloaaat