Qt: стиль QTabWidget

Я использую Qt, и у меня есть настройка QTabWidget в редакторе Qt Designer, вы можете видеть это на рисунке 1.

картинка 1

Как вы можете видеть, после Tab4 есть пустое пространство до правого края, каким-то образом мне нужно заполнить это пространство цветом, как на картинке 2 (лучше всего было бы установить исчезающий цвет) . Или другим решением было бы, чтобы вкладки плавали, чтобы покрыть весь экран.

картинка 2

Сейчас я использую следующую таблицу стилей:

QTabWidget::tab-bar {

 }

 QTabBar::tab {
  background: gray;
  color: white;
  padding: 10px;
 }

 QTabBar::tab:selected {
  background: lightgray;
 }

Есть ли способ установить цвет фона QTabBar с помощью таблиц стилей Qt? Или я могу получить вкладки, плавающие к краю, используя таблицы стилей Qt?

РЕДАКТИРОВАТЬ: я пробовал решение, которое Caleb Huitt-cjhuitt предложил ниже. Мне очень нравится идея расширения вкладок, но я не могу заставить ее работать.

В редакторе Qt Designer я щелкаю правой кнопкой мыши на моем QTabWidget-> «Promote To...» и выбираю «Имя базового класса»: QTabWidget «Имя продвигаемого класса»: ExpandableTabWidget, затем я нажимаю «Добавить», а затем «Продвигать».

В методе инициализации виджета, который содержит мой QTabWidget, я установил

ui.tabWidget->SetTabsExpanding(true);

Все строится нормально, но QTabbar не расширяется.

Я делаю что-то неправильно?

Спасибо!


person Martin    schedule 19.03.2010    source источник
comment
Вы пытались придать панели вкладок фоновый цвет? каков был результат?   -  person smerlin    schedule 20.03.2010
comment
Да, проверял, но ничего не произошло. Любые идеи?   -  person Martin    schedule 20.03.2010
comment
Спасибо! Но это то, с чем я играл до сих пор, но безрезультатно. Разве это не возможно?   -  person Martin    schedule 20.03.2010
comment
Строка Q_PROPERTY, вероятно, поможет вам, только если вы превратите виджет расширяющейся вкладки в плагин. В противном случае, если он генерирует предупреждения, вы можете удалить его.   -  person Caleb Huitt - cjhuitt    schedule 21.03.2010
comment
Кроме того, что касается виджета раскрывающейся вкладки, я предполагал, что это сработает, хотя сам никогда этого не делал. Если это не сработает, вы можете довольно легко создать свой собственный виджет вкладки с QTabBar над QFrame и QStackedWidget внутри этого QFrame. Конечно, вам нужно добавить некоторую логику для обработки переключения. Тем не менее, я бы еще немного поковырялся, чтобы попытаться выяснить, почему вкладки не расширяются.   -  person Caleb Huitt - cjhuitt    schedule 21.03.2010
comment
Ага, я совсем новичок в Qt, поэтому я не знал о плагинах. Странно, что он вообще не расширяет QTabBar, я играл с ним, но ничего не произошло. Пожалуйста, напишите, если вы добьетесь какого-либо прогресса. Большое спасибо!   -  person Martin    schedule 22.03.2010


Ответы (4)


Как расширение вкладок, так и окрашивание фона можно выполнить с помощью таблиц стилей.

Для расширяемых вкладок к вкладкам может быть применена таблица стилей, которая устанавливает их ширину равной части общей ширины QTabWidget. Так как таблицу стилей нужно будет обновлять при изменении размера, она применяется с использованием фильтра событий. См. первый пример кода ниже.

Хотя фон панели вкладок можно задать, панель вкладок не заполняет все пространство над панелью вкладок. Это контейнер (или родительский виджет), который просвечивает. Чтобы управлять цветом этой области, поместите QTabWidget в QWidget и установите таблицу стилей в контейнере. См. второй пример кода ниже.

Раскрывающиеся вкладки:

#include <QtGui>

// Sets the style sheet of the QTabWidget to expand the tabs.
static void expandingTabsStyleSheet(QTabWidget *tw)
{
    tw->setStyleSheet(QString("QTabBar::tab { width: %1px; } ")
                      .arg(tw->size().width()/tw->count()));
}

// On resize events, reapply the expanding tabs style sheet
class ResizeFilter : public QObject
{
    QTabWidget *target;
public:
    ResizeFilter(QTabWidget *target) : QObject(target), target(target) {}

    bool eventFilter(QObject *object, QEvent *event)
    {
        if (event->type() == QEvent::Resize)
            expandingTabsStyleSheet(target);
        return false;
    }
};


int main(int argc, char * argv[])
{
  QApplication app(argc, argv);

  QTabWidget *tw = new QTabWidget;
  tw->installEventFilter(new ResizeFilter(tw));
  tw->addTab(new QWidget, "Tab1");
  tw->addTab(new QWidget, "Tab2");
  tw->addTab(new QWidget, "Tab3");

  tw->show();

  return app.exec();
}

Фон рядом с вкладками:

#include <QtGui>

int main(int argc, char * argv[])
{
  QApplication app(argc, argv);

  QWidget *container = new QWidget;
  container->setStyleSheet("background: qlineargradient( x1: 0, y1: 0, x2: 1, y2
: 0, stop: 0 black, stop: 1 blue);");

  QHBoxLayout *layout = new QHBoxLayout(container);
  layout->setContentsMargins(0, 0, 0, 0);

  QTabWidget *tw = new QTabWidget(container);
  layout->addWidget(tw);
  tw->setStyleSheet(
      "QTabBar::tab { background: gray; color: white; padding: 10px; } "
      "QTabBar::tab:selected { background: lightgray; } "
      "QTabWidget::pane { border: 0; } "
      "QWidget { background: lightgray; } ");
  tw->addTab(new QWidget, "Tab1");
  tw->addTab(new QWidget, "Tab2");
  tw->addTab(new QWidget, "Tab3");

  container->show();

  return app.exec();
}
person baysmith    schedule 25.03.2010
comment
действительно отличный ответ! Я часами боролся с этой проблемой, прежде чем нашел ваш ответ :-) - person Carlos Cordoba; 20.06.2015
comment
Пробуя это на macOS, я обнаружил, что экран продолжает увеличиваться в ширину, пока я не остановлю его в отладчике! Однако на iOS работает нормально, так что спасибо за это. - person Pete; 23.12.2017

Как я вижу, у вас есть два варианта, в зависимости от того, что вы хотите сделать.

Чтобы заполнить фон цветом:

Воспользуйтесь прозрачностью этой части виджета вкладки.

QWidget *bg = new QWidget( parent );
bg->setAutoFillBackground( true );
QPalette bg_palette = bg->palette();
bg_palette.setColor( QPalette::Window, QColor( "orange" ) );
bg->setPalette( bg_palette );

QHBoxLayout layout = new QHBoxLayout();
layout->setMargin( 0, 0, 0, 0 );
layout->setSpacing( 0 );
bg->setLayout( layout );

QTabWidget *tab_widget = new QTabWidget();
// set up tab_widget however you want...
layout->addWidget( tab_widget );

Это делает виджет bg полностью оранжевым, но поскольку большая часть виджета вкладки будет отображаться поверх виджета bg, вы увидите оранжевый цвет только там, где виджет вкладки не рисуется.

Чтобы вкладки расширялись:

Я думал, что это будет проще, чем есть на самом деле, но вам в основном нужно создать подкласс QTabWidget, чтобы получить доступ к виджету панели вкладок, который он использует.

class ExpandableTabWidget : public QTabWidget
{
    Q_OBJECT;
    Q_PROPERTY( bool expanding_tabs READ Expanding WRITE SetExpanding );

public:
    ExpandableTabWidget( QWidget *parent = NULL ) : QTabWidget( parent )
    {
    }

    bool Expanding() const
    {
        return tabBar()->expanding();
    }

    void SetTabsExpanding( bool expanding = true )
    {
        tabBar()->setExpanding( expanding );
    }
};

Затем вам нужно будет либо превратить свой класс ExpandableTabWidget в плагин и использовать его в дизайнере, либо вы можете сделать свой виджет вкладки типом ExpandableTabWidget и установить расширяющееся значение в коде. Если вы решите выполнить продвижение, вы не увидите желаемых результатов в дизайнере, но вы увидите их при запуске своей программы.

person Caleb Huitt - cjhuitt    schedule 20.03.2010
comment
Большое спасибо за ваши идеи! Я обновил свой первоначальный вопрос выше, добавив несколько вопросов, касающихся расширяющегося решения, не могли бы вы взглянуть на него? Еще раз спасибо! - person Martin; 21.03.2010

В qt 4.5 есть новое свойство, управляющее отрисовкой виджета вкладки, называемое documentMode. Просто вызовите tabWidget->setDocumentMode(true) и установите цвет фона QTabBar с помощью таблиц стилей.

Из документации Qt:

Это свойство определяет, отображается ли виджет вкладки в режиме, подходящем для страниц документа. Это то же самое, что и режим документа в Mac OS X.

Когда это свойство установлено, рамка виджета вкладки не отображается. Этот режим удобен для отображения страниц типа документа, где страница занимает большую часть области виджета вкладки.

person PiXy    schedule 17.02.2011

У меня была такая же проблема некоторое время назад. Я добился этого, сделав «большую» верхнюю границу и переместив панель вкладок с отступом.

person Kamil Klimek    schedule 23.03.2010
comment
Спасибо! Но дело в том, что мне нужно, чтобы на моем фоне было затухание, иначе это сработает. - person Martin; 23.03.2010
comment
что вы имеете в виду под исчезновением? Вы можете установить градиент в качестве цвета границы - person Kamil Klimek; 23.03.2010
comment
Вот пример того, чего можно добиться с помощью Qt CSS: pl.tinypic.com/r/24lsn5v/ 5, а вот CSS: QTabWidget::pane {border: 0; граница-верх: 30px сплошной линейный градиент (x1:0, y1:0, x2:0, y2:1, стоп: 0 красный, стоп: 1 желтый); фон: желтый; } QTabWidget::tab-bar { top: 30px; } - person Kamil Klimek; 23.03.2010