Qt: стиль QTabWidget

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

picture 1

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

picture 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-> "Повышать до..." и выбираю "Имя базового класса": QTabWidget "Имя повышенного класса": ExpandableTabWidget, а затем нажимаю "Добавить", а затем "Повышать".

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

ui.tabWidget->SetTabsExpanding(true);

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

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

Спасибо!

Ответ 1

Обе расширяющиеся вкладки и раскраска фона могут быть выполнены с использованием таблиц стилей.

Для расширения вкладок таблица стилей может быть применена к вкладкам, которые устанавливают их ширину на долю от общей ширины 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();
}

Ответ 2

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

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

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

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 и установить значение расширения в коде. Если вы решите сделать продвижение по службе, вы не увидите результаты, которые вы хотите в дизайнере, но вы будете запускать свою программу.

Ответ 3

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

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

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

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

Ответ 4

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