Qt: плавные скругления углов выпадающего списка QComboBox:
Уважаемые Форумчане! Помогите мне, пожалуйста, в таком вопросе: необходимо округлить углы выпадающего списка QComboBox таким образом, чтоб имели место быть плавные скругления. Не могли бы вы мне что-нибудь посоветовать...
Я пробовал делать это с помощью маски - не вышло потому, что маска по QRegion давала резкие углы, т.е. без плавного скругления, маска через битмап не подходит ввиду ее громоздкости и медленности работы.
Пробовал еще забирать у комбобокса вью через одноименный метод, и его использовать как инициализатор для QPainter, которым пробовал рисовать на этом виджете.
Также пробовал создавать свой класс списка комбобокса - наследника от QListView - с перегруженным paintEvent, но также потерпел неудачу.
Благодарю очень всех за ответы!
Ответы (1 шт):
Переопределять paintEvent в наследнике списка - бесполезно, поскольку всплывающий список это отдельное окно. (Список является вложенным элементом этого окна. Соответственно, рисуется прямоугольное окно и список со скругленными углами внутри него.)
У нас фактически нет доступа к классу QComboBoxPrivateContainer, поскольку он не документирован.
Простое, но хакерское решение:
QWidget* popup_window = comboBox.view()->window();
popup_window->setAttribute(Qt::WA_TranslucentBackground, true);
popup_window->setStyleSheet("QComboBoxPrivateContainer{background-color: white; border: 1px solid black; border-radius: 20px; padding: 8px};" );
Здесь плохо то, что используется недокументированное имя класса, которое авторы Qt могут изменить, но, не меняли с момента появления класса.
Более длинное решение:
- Создать свой класс всплывающего окна (аналог QComboBoxPrivateContainer), со скругленными углами.
- Переопределить методы QComboBox::showPopup, QComboBox::hidePopup. Создавая новое окно, вкладывая в него view в качестве элемента, устанавливать положение окна, показать, скрыть при потере фокуса ...
Унаследовать реализацию от QComboBoxPrivateContainer невозможно, поскольку класс не документирован и отсутствует в заголовочных файлах, но посмотреть на реализацию можно: https://code.woboq.org/qt5/qtbase/src/widgets/widgets/qcombobox_p.h.html https://code.woboq.org/qt5/qtbase/src/widgets/widgets/qcombobox.cpp.html