QComboBox соединен с QSpinBox - PullRequest
       8

QComboBox соединен с QSpinBox

2 голосов
/ 28 сентября 2011

Итак, я пишу графический интерфейс Qt для некоторого научного программного обеспечения, и у меня есть QSpinBoxes и QDoubleSpinBoxes для количеств, которые пользователь должен установить в единицах измерения. Поскольку у меня есть несколько из этих пар спинбокс со списком, я думаю, было бы наименее запутанным, если бы ComboBox справа слился со SpinBox слева.

Я пытался сделать это с помощью таблиц стилей, но я теряю стиль пластики, когда делаю это.

Каков был бы [предпочтительно не глупый] способ сделать это?

Спасибо

Andreas

1 Ответ

2 голосов
/ 28 сентября 2011

Если под слиянием вы подразумеваете, что расстояние между spinbox и выпадающим списком должно быть равно нулю, то вы должны создать потомок QProxyStyle, переопределить styleHint для возврата -1, если запрашивается QStyle::PM_LayoutHorizontalSpacing, и объявить слот с именем layoutSpacingImplementation (читай Документация QStyle ), которая получает оба типа виджетов (представляющих их перечисления).

MyClass::layoutSpacingImplementation( QSizePolicy::ControlType control1, 
                                      SizePolicy::ControlType control2, 
                                      Qt::Orientation orientation,
                                      const QStyleOption * option = 0,
                                      const QWidget * widget = 0 ) const
{
    if (orientation == Qt::Horizontal &&
        ((control1 == QSizePolicy::SpinBox && control2 == QSizePolicy::ComboBox) || 
         (control2 == QSizePolicy::SpinBox && control1 == QSizePolicy::ComboBox)))
               return 0;

    int spacing = baseStyle()->styleHint(QStyle::PM_LayoutHorizontalSpacing);
    if (spacing >= 0) return spacing;
    return baseStyle()->layoutSpacing(control1, control2, orientation, option, widget);
}

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

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

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

Только что видел размещенное изображение.В стандартном qt такого контроля нет, и его достижение типичными средствами маловероятно.Вы можете попытаться создать свой собственный класс макета или свой собственный потомок QWidget, в котором ваш спинбокс будет частично покрывать комбинированный список (точнее, охватывающий левые круглые края), создавая таким образом иллюзию слияния.Это, однако, может показаться уродливым, если пользователь использует стиль с более широкими краями поля со списком, который будет «смотреть наружу» на боковой стороне ящика.Это быстрый и очень уродливый обходной путь.

Кроме этого, я думаю, что единственный вариант, который у вас есть, - это создать свой собственный виджет - но даже с использованием функций рисования из QStyle (я думаю, в основном это drawControl) и обрывков кода, реализующих отдельныеQSpingBox и QCombobox это будет означать много и много работы.Учитывая, что вы хотите добиться простого графического эффекта в пользовательском интерфейсе, я бы сказал, что это не стоит усилий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...