QT: моделирование QTabWidget

Я использую QT, и я сделал, чтобы QTabWidget установил в спокойном Редакторе Разработчика, Вы видите его в изображении 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 Editor I по моему QTabWidget-> "Продвигают..." и выбирают "Base class name": QTabWidget "Способствовал имени класса": ExpandableTabWidget и затем я нажимаю, добавляют и затем Продвигают.

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

ui.tabWidget->SetTabsExpanding(true);

Все создает прекрасный, но QTabbar не расширяется.

Я делаю что-то не так?

Спасибо!

11
задан Glorfindel 3 July 2019 в 13:05
поделиться

3 ответа

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

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

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

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

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

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
ответ дан 3 December 2019 в 05:12
поделиться

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

0
ответ дан 3 December 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: