Виджет под QTabBar с нежелательной рамкой - PullRequest
7 голосов
/ 31 мая 2011

У меня проблема с QTabBar / QTabWidget. Вот как выглядит моя программа на данный момент, используя QTabBar:

enter image description here

Как видите, между QTabBar и QScrollArea есть некрасивая линия. Эта строка является частью фрейма QScrollArea, от которого я просто не могу избавиться, потому что это требуется с трех других сторон. Я понимаю, что мог бы использовать QTabWidget, но тогда мне нужно было бы создать виджет для каждой вкладки, что здесь неосуществимо: содержимое QScrollArea изменяется в соответствии с выбранной вкладкой, но есть только один виджет QScrollArea. (Дублирование его каждый раз при создании новой вкладки вызовет свои проблемы.)

Так кто-нибудь знает способ:
(i) сказать QScrollArea нарисовать рамку без верхней линии; или
(ii) использовать один и тот же виджет для каждой вкладки в QTabWidget?

Обновление 3 Для другого подхода см. Мой ответ ниже.

Обновление 1 Я выполнил предложение Звезди, и неприглядная строка исчезла:

enter image description here

Это улучшение. Но это не правильно. Посмотрите на промежутки между полосами прокрутки и границей. Справа два пикселя вместо одного; внизу это три пикселя. А зазор справа между границей QScrollArea и границей mainWidget на один пиксель слишком велик. Это связано с стилем границ QTabWidget, который я теряю в здравом уме, пытаясь измениться. Если я скажу:

MyTabWidget -> setStyleSheet ("QTabWidget::pane { margin: 0px,0px,0px,0px }") ;

тогда поля кажутся правильными, но границы исчезают:

enter image description here

Если я скажу:

MyTabWidget -> setStyleSheet ("QTabWidget::pane { "
  " margin: 0px,0px,0px,0px;"
  " border: 1px solid darkgray;"
  "}") ;

тогда я почти вернулся к тому, с чего начал:

enter image description here

Если я попытаюсь исправить это с помощью:

ApplicationTabWidget -> setStyleSheet ("QTabWidget::pane { "
"   margin: 0px,0px,0px,0px;"
" border: 1px solid darkgray;"
" border-top: 0px;"
      "}") ;

потом опять меня высмеивают за мои боли:

enter image description here

Обновление 2 Если я забуду setStyleSheet и просто включу documentMode, вот что я получу:

enter image description here

Пожалуйста, кто-нибудь, скажите мне, что я глуп, и есть совершенно простое решение для всего этого.

Ответы [ 3 ]

2 голосов
/ 02 июня 2011

Вы сказали, что «содержимое QScrollArea изменяется в соответствии с выбранной вкладкой», хорошо, если я предполагаю, что это не так, и вы имеете в виду, что содержимое виджета, находящегося внутри области прокрутки, изменяется, тогда вы можетепопробуйте это:

Создайте столько объектов QScrollArea, сколько вкладок вам нужно в вашем QTabWidget, но только одну, например QTextEdit, которую вы будете показывать в каждой области прокрутки, и какое содержимое будет меняться при смене вкладок (takeWidget() из старой вкладки QScrollArea & setWidget () на новой вкладке QScrollArea)

Я не знаю, как вы создали свой код, но, чтобы попробовать мое предложение, ваш код должен быть создан вокруг виджета внутриQScrollArea, а не сама QScrollArea.

2 голосов
/ 31 мая 2011

Если я не пойму неправильно, если вы отключите границу QScrollArea, установив для frameShape значение NoFrame, виджет со вкладками по-прежнему будет иметь линии рамки по бокам и снизу, где вы хотите их.

0 голосов
/ 03 июня 2011

Я попробовал другой подход: используйте QTabBar, как на первом скриншоте, а затем измените стиль на MyScrollArea (очевидно, в ретроспективе):

MyScrollArea -> setStyleSheet ("QScrollArea {"
  "border: 1px solid #898C95;"
  "border-top: 0px;"
  " }") ;

Это результат:

enter image description here

Почти верно! Есть три проблемы:
- маленький квадрат на пересечении двух полос прокрутки пропускает свою нижнюю границу (но он рисуется, если я нажимаю на полосы прокрутки, или изменяю размер окна, или главное окно теряет фокус);
- цвет #898C95 жестко запрограммирован, поэтому не будет правильным, если пользователь изменит стиль. Но если я пропущу стиль border, то вся рамка будет окрашена в белый цвет. Есть ли способ запросить текущий цвет границы стиля?
- самое серьезное, цвет фона виджета точки останова с левой стороны больше не белый.

Но я думаю, что потратил на это достаточно времени! Я буду придерживаться этого решения, если кто-то не может предложить что-то еще попробовать.

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