Виджет под QTabBar с нежелательным фреймом

#c #qt #qt4

#c #qt #qt4

Вопрос:

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

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

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

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

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

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

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

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

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

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

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

Если я скажу:

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

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

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

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

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

и снова меня высмеивают за мои старания:

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

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

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

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

Ответ №1:

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

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

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

Комментарии:

1. Это выглядит многообещающе! Я не могу сделать это именно так, потому что у меня есть подкласс QScrollArea (поэтому содержимое действительно меняется). Но я попробую создать каждую вкладку с фиктивным виджетом и переместить подкласс QScrollArea в фиктивный виджет текущей вкладки.

2. Я реализовал ваше предложение, и это определенно улучшение. Но это все равно неправильно! Я обновил свой вопрос множеством скриншотов.

3. Смотрите мой новый ответ для другого подхода.

Ответ №2:

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

Комментарии:

1. Да, если это QTabWidget. Но не в том случае, если это QTabBar. Я не могу использовать QTabWidget, потому что у меня есть только один виджет для отображения.

Ответ №3:

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

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

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

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

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

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