Qt TabStop цветовые проблемы

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

1

Решение

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

Есть способ избавиться от прямоугольника фокуса — Вот пример того, как это сделать для кнопок. Хотя вам придется обрабатывать этот элемент управления с помощью элемента управления. По сути, это происходит при рендеринге элемента управления, вы игнорируете состояние фокуса и рисуете элемент управления так, как будто он не сфокусирован.

Чтобы полностью изменить внешний вид прямоугольника фокуса, я полагаю, вы можете переопределить сам примитив. Многие виджеты состоят из многократно используемых примитивов. Поэтому при создании объекта 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, мы запираем приложение в виде окон. Существуют и другие базовые стили, которые вы можете использовать, кроме Windows (например, QMacStyle и т. Д.), Но суть в том, что вы должны знать, во что вы ввязываетесь, прежде чем идти по этому пути.

это хорошая статья о QStyles и о том, как использовать их возможности в своих интересах.

РЕДАКТИРОВАТЬ:

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]