Установите границу для QSpinBox, когда он сфокусирован

Для уже существующего проекта Qt я хотел бы установить границу для сфокусированных виджетов через qss-файл. Но столкнулся с неожиданным результатом. Когда я изменяю границу QSpinBoxQDoubleSpinBox), граница изменится, как я ожидаю, но кнопки вверх и вниз тоже меняются и выглядят некрасиво.

введите здесь описание изображения

Вот мое определение стиля (полный пример доступен здесь):

QSpinBox:focus
{
    border-width: 2px;
    border-style: solid;
    border-color: green;
}

Мой вопрос: как изменить внешний вид границы и одновременно сохранить внешний вид кнопки вверх и вниз. Решение, которое я ищу, не должно быть кросс-платформенным или кросс-версией.

Моя среда:
- KUbuntu 15.10 (amd64);
- Qt 5.4 (x64).

Обновление:

Вот еще один пример с другим стилем:

QSpinBox
{
    border-width: 2px;
    border-style: solid;
    border-color : red;
}

QSpinBox:hover
{
    border-width: 2px;
    border-style: solid;
    border-color: blue;
}

Виджет выглядит так:

введите здесь описание изображения


person Gluttton    schedule 02.02.2016    source источник
comment
Я думаю, вы уже пытались установить стиль для стрелок вверх и стрелок вниз? Если нет примеров qss, то doc.qt.io/qt -4.8/stylesheet-examples.html#customizing-qspinbox   -  person floppy12    schedule 02.02.2016
comment
Возможно, ваша проблема связана с распространением вашего стиля фокуса на весь виджет, включая стрелки, в частности, свойство border-with..., что может вызвать такое неожиданное поведение   -  person floppy12    schedule 02.02.2016
comment
@floppy12, я не пробовал. Мне сложно воспроизвести внешний вид кнопок.   -  person Gluttton    schedule 03.02.2016
comment
Вы не должны воспроизводить его целиком; я имел в виду, что вы должны уточнить стиль, даже стиль по умолчанию, чтобы предотвратить переопределение стиля фокуса - возьмите пример из ссылки ниже и попробуйте.   -  person floppy12    schedule 03.02.2016
comment
@floppy12, precise a style even a default one Я не понимаю, как это сделать. Можете ли вы привести пример? Вы имеете в виду: QSpinBox::up-button {}?   -  person Gluttton    schedule 03.02.2016
comment
Для чего это стоит: я получаю очень похожее поведение на Qt5.4 в Windows, когда устанавливаю вашу таблицу стилей в счетчик - кнопки выглядят уродливо. На самом деле кажется, что как только вы вносите какие-либо изменения в таблицу стилей для счетчика, вам нужно пройти весь путь и указать остальное через таблицу стилей (как предложила floppy12). Но на самом деле: должны ли мы (то есть ОП) предоставлять наши собственные up_arrow.png и т. д., сделанные вручную, чтобы заставить работать простое изменение стиля? Насколько это запутано? Я согласен с Glutton, что это будет сложно!   -  person ThorngardSO    schedule 04.02.2016
comment
Когда вы меняете границу, собственный стиль платформы удаляется. Есть только один способ предотвратить такие сбои: использовать несколько неродных стилей. Например: QApplication::setStyle( QStyleFactory::create( "Fusion" ) );   -  person Dmitry Sazonov    schedule 05.02.2016
comment
@Saz, когда я добавлю следующую строку, внешний вид виджета останется таким же, как на скриншоте.   -  person Gluttton    schedule 05.02.2016
comment
Пожалуйста, взгляните на этот пост: qtcentre.org/ темы/   -  person frogatto    schedule 12.02.2016


Ответы (2)


Когда вы применяете таблицу стилей к QSpinBox, этот виджет полностью рисуется с помощью QStyleSheetStyle (этот класс не является частью общедоступного API).

Таким образом, вы должны либо полностью стилизовать свой счетчик, включая кнопки вверх/вниз, либо вообще не использовать таблицу стилей.

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

Поэтому я предлагаю создать подкласс QSpinBox и переопределить метод paintEvent(). В вашем методе paintEvent() вы просто вызовете его реализацию по умолчанию, а затем нарисуете прямоугольник.

person Tomas    schedule 05.02.2016
comment
именно то, что я предложил ... +1 - person floppy12; 07.02.2016

попробуйте отредактировать файл qss с другим случайным стилем, чтобы увидеть, соответствует ли он.

QSpinBox
{
    border-width: 2px;
    border-style: solid;
    border-color : red;
}

QSpinBox:hover
{
    border-width: 2px;
    border-style: solid;
    border-color: blue;
}

Редактировать :

Я вижу, что ваши стрелки все еще в плохой форме, поэтому я бы посоветовал вам две вещи:

  • стилизуйте также свои стрелки вверх-вниз со свойством фонового изображения или около того (сделайте снимок экрана с нужными стрелками... или около того)

  • подделать эту часть с помощью таблицы стилей и переопределить «обработчик QPaintEvent onFocus» с помощью кода. Установить границу зеленой было бы не так болезненно

person floppy12    schedule 03.02.2016
comment
Отредактировано с предложением - person floppy12; 04.02.2016
comment
Первый случай очень плохой для меня. Второй случай более-менее приемлем, но в любом случае это не выход. - person Gluttton; 05.02.2016