Qt:造型QTabWidget

时间:2010-03-19 21:43:55

标签: qt qtstylesheets qtabwidget

我正在使用Qt,我在Qt Designer编辑器中设置了QTabWidget,你可以在图1中看到它。

picture 1 http://i40.tinypic.com/1109ba1.jpg

正如你在Tab4之后看到的那样,一直到右边有一个空的空间,在某种程度上我需要用一种颜色填充那个空间,如图2所示(最好的办法就是设置一个褪色)。或者另一种解决方案是标签浮出来覆盖整个屏幕。

picture 2 http://i41.tinypic.com/zwmijr.jpg

我现在使用以下样式表:

QTabWidget::tab-bar {

 }

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

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

有没有办法使用Qt样式表设置QTabBar的背景颜色?或者我可以使用Qt样式表将标签浮动到边缘?

编辑: 我一直在尝试Caleb Huitt - cjhuitt在下面提出的解决方案。我非常喜欢让标签扩展但无法使其正常工作的想法。

在Qt Designer编辑器中,我右键单击我的QTabWidget->“Promote To ...”并选择“基类名称”:QTabWidget “提升的类名”:ExpandableTabWidget 然后我点击添加,然后点击推广。

在包含我的QTabWidget的小部件的init方法中,我设置了

ui.tabWidget->SetTabsExpanding(true);

一切正常,但QTabbar不会扩展。

我做错了吗?

谢谢!

4 个答案:

答案 0 :(得分:17)

可以使用样式表来完成展开选项卡和为背景着色。

对于展开标签,可以将样式表应用于标签,将标签的宽度设置为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();
}

答案 1 :(得分:3)

在我看来,你有两种选择,具体取决于你想做什么。

用颜色填充背景

利用标签小部件中该部分的透明度。

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类型,并在代码中设置扩展值。如果您选择进行促销,您将无法在设计师中看到所需的结果,但是在运行程序时将会看到。

答案 2 :(得分:2)

在qt 4.5上,有一个新属性可以控制选项卡小部件呈现,称为 documentMode 。只需调用tabWidget->setDocumentMode(true)并使用样式表设置QTabBar的背景颜色。

来自Qt文档:

  

此属性保存选项卡窗口小部件是否以适合文档页面的模式呈现。这与Mac OS X上的文档模式相同。

     

设置此属性时,不会呈现选项卡窗口小部件框架。此模式对于显示页面覆盖大部分选项卡小部件区域的文档类型页面非常有用。

答案 3 :(得分:0)

前段时间我遇到同样的问题。我通过制作“大”顶部边框,并使用边距移动标签栏来实现它