В моем приложении у меня есть раздражающий белый прямоугольник на элементах управления tabstop. Я попытался посмотреть в таблицах стилей, но myitem: стиль tabstop ничего не делает. Есть ли способ, каким-либо образом изменить цвет tabstop/или сделать его другой формой.Qt TabStop проблемы с цветом
ответ
К сожалению, прямоугольник фокусировки не является чем-то, на что могут повлиять таблицы стилей. Таблицы стилей потрясающие, но, к сожалению, есть некоторые ограничения.
Существует способ избавиться от прямоугольника фокуса - 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). И это хорошо.
Привет, я пытался использовать это, но в конце концов я не могу найти класс QWindowsStyle. Я полагаю, что он был удален в новой версии QT. – SirLanceloaaat
Вы используете Qt5? Я все еще на 4.8. *. По-прежнему существует способ сделать это с помощью QProxyStyle. Я обновляю свой ответ с помощью нескольких ссылок. – Liz
Я работал с QProxyStyle. Вопрос закрыт. – SirLanceloaaat
Пожалуйста, добавьте больше деталей, описывающих проблему. Попробуйте добавить скриншот проблемы и соответствующего кода, чтобы помочь другим пользователям понять, что именно вы получаете здесь. – animuson