nixp.ru v3.0

18 октября 2017,
среда,
21:37:30 MSK

DevOps с компанией «Флант»
Аватар пользователя Максим
Максим написал 3 августа 2011 года в 14:34 (2448 просмотров) Ведет себя как мужчина; открыл 3 темы в форуме, оставил 10 комментариев на сайте.

В проекте необходимо задействовать рамки вокруг виджета. Чтобы самому не реализовывать решил вместо класса QWidget использовать QFrame. Там есть несколько стилей рисования этих самых рамок, НО под линуксом (как в KDE, так и в Gnome) всегда отображается одна и та же тема (KDE — StyledPanel; Gnome — Box), независимо от той, которую я задал в конструкторе.

Дальнейшие эксперименты показали, что изменить тему можно, но это необходимо сделать уже во время работы основного цикла программы. Самый простой способ — реализовать свой paintEvent и в нём в начале задавать необходимый стиль. Второй способ сгенерировать какое-нибудь событие (например, таймера) и в обработчике так же задать стиль.

Первый способ работает очень медленно. Метод setFrameStyle оказался довольно тяжёлым. Второй уж очень уродлив.

Если кто в курсе данной проблемы, то HELP!

P.S.: проверил в винде, там данной проблемы нету.

arhimedoffs

Крайне странно, только что проверил поведение в Gnome — стиль раки фрейма тот что я задал. Т.е. создал в дизайнере тестовое окошко, кинул в него 4 фрейма с разными стилями и сгенерил питоновский код (мне привычнее). При запуска все четыре фрейма имели свой заданый стиль. Если взглянуть в код, то там никаких изощрений нет:

self.frame = QtGui.QFrame(Dialog)
self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
self.frame.setFrameShadow(QtGui.QFrame.Raised)
self.frame.setObjectName("frame")


Соответственно вместо QtGui.QFrame.StyledPanel задается для каждого своё.

А вообще если интересуют просто рамочки вокруг виджета, то крайне рекомендую посмотреть в соторону StyleSheets, намного удобнее, более гибко и, как по мне, более правильно. Так к примеру чтобы задать скругленную зеленую рамку вокруг виджета достаточно лишь:

frame_obj->setStyleSheet(QString::fromUtf8("border: 2px solid green; border-radius: 4px; padding: 2px;"));

Притом подобный подход применим для любого виджета поддерживающего Box Model (более подробно смотрите в документации Qt Style Sheets Reference).

Максим

За StyleSheet спасибо. Я уже забыл совсем про него.

На счёт отображения. Нашёл проблему в KDE. Я совсем забыл, что у меня вместо стандартной темы стоял QtCurve. Именно он всю «малину» и портил. С Гномом ситуация следующая. Дома поставил 32-битную Убунту, и всё отлично заработало. Но раньше я проверял на 64-битной. Возможно в этом проблема. Хотя я уже больше склоняюсь к тому, что скорее всего, как и в KDE, наустанавливал чего-то для настройки внешнего вида, вот и результат.

arhimedoffs

Может и так, я проверял как раз на  Ubuntu 10.04 (amd64).