#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
стиль, то вся граница будет окрашена в белый цвет. Есть ли способ запросить текущий цвет границы стиля?
— самое серьезное, цвет фона виджета точки останова с левой стороны больше не белый.
Но я думаю, что потратил на это достаточно времени! Я буду придерживаться этого решения, если кто-нибудь не предложит попробовать что-то еще.