Qt: Стиль QTabWidget

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

изображение 1 http://i40.tinypic.com/1109ba1.jpg

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

Изображение 2 http://i41.tinypic.com/zwmijr.jpg

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

QTabWidget::tab-bar {

 }

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

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

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

изменить: Я пытаюсь решение, что Huitt Калеб - cjhuitt, предложенные ниже. Мне очень нравится идея расширения вкладок, но я не могу ее получить рабочий.

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

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

ui.tabWidget->SetTabsExpanding(true);

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

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

спасибо!

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();
}

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

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

воспользуйтесь преимуществами прозрачности этой части виджета tab.

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


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

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

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

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


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