【问题标题】:How to custom QTabWidget tab?如何自定义 QTabWidget 选项卡?
【发布时间】:2018-04-16 03:10:50
【问题描述】:

问题是:

客户面板是从 QTabWidget 派生的,并且有一些带有一些小部件的选项卡

其中操作员(人)可以编辑数据。当任何小部件中的数据发生更改时

我检查了它,我在 QLabel 中设置了粗体字体,这是这个小部件的“伙伴”。我通过设置来做到这一点:

QFont fontBold; fontBold.setBold(true); 
widget->setFont(fontBold)

到目前为止一切顺利。

接下来,我希望在其中有修改和未保存数据的选项卡也用粗体标记。即使用户切换到其他选项卡,并且他留下未保存的数据,此选项卡也应保持用粗体标记,直到他返回并保存数据。

这就是问题所在。

如果我为小部件或 QTabBar 设置 setFont - 所有文本或所有选项卡都被标记 粗体。

在我从 QTabWidget 派生的类中,我有:

QTabBar *tabBar() const { return QTabWidget::tabBar(); }

所以我可以访问 tabBar,例如使用 setTabTextColor - 用不同的颜色标记这个标签 - 这是某种解决方案,但其他“伙伴”标签用粗体标记,所以 tabText 应该是粗体。

如果我使用 setStyleSheet 我可以制作粗体,但也有一个问题:

this->tabBar()->setStyleSheet("QTabBar::tab { font:bold }");

如果我使用像活动这样的伪状态,这会将所有选项卡设置为粗体, 已选择,等等 - 当用户切换到其他选项卡时它会发生变化,我需要保持此选项卡为粗体,直到数据被保存。

我可以使用 setProperty,然后为具有特定属性的小部件制作 styleSheet,但真正的问题是,我不能,或者不知道如何访问 QTabBar 中的一个选项卡(例如通过知道它的索引号)

我已经看到,在 QT3 中有 QTab* QTabBar::tab(int) 可以访问特定选项卡,但这不再可用。我阅读了http://qt.nokia.com/doc/4.5/stylesheet-examples.htmlhttp://qt.nokia.com/doc/4.5/stylesheet-reference.html 并没有找到解决方案。

如何访问 QTabBar 中的特定选项卡(通过其索引号)或如何使用 styleSheet 为特定选项卡设置字体:粗体,当用户切换到其他选项卡时保留粗体字体?

提前致谢。

【问题讨论】:

  • 测试我的答案,如果有效,请不要忘记将其标记为正确

标签: c++ qt qt5 qtabwidget qtabbar


【解决方案1】:

要执行此任务,我们必须重写paintEvent() 方法以创建一个继承QTabBar 的类。

class TabBar: public QTabBar{
    QVector<int> mUnSaved;
public:
    void setUnsaved(int index){
        if(index >= count() || index < 0)
            return;
        mUnSaved << index;
        update();
    }
    void setSaved(int index){
        if(!mUnSaved.contains(index))
            return;
        mUnSaved.remove(mUnSaved.indexOf(index));
        update();
    }
protected:
    void paintEvent(QPaintEvent */*event*/){

        QStylePainter painter(this);
        QStyleOptionTab opt;

        for(int i = 0;i < count();i++)
        {
            initStyleOption(&opt,i);
            painter.save();
            if(mUnSaved.contains(i)){
                painter.setFont(QFont("Times", 10, QFont::Bold));
            }
            painter.drawControl(QStyle::CE_TabBarTabShape, opt);
            painter.drawControl(QStyle::CE_TabBarTabLabel,opt);
            painter.restore();
        }
    }
};

那么我们在下面的例子中使用它

class TabWidget : public QTabWidget
{
    TabBar *mTabBar;
public:
    TabWidget(QWidget *parent=0):QTabWidget(parent){
        mTabBar = new TabBar;
        setTabBar(mTabBar);
        for(int i=0; i < 5; i++){
            QString text = QString("Tab %1").arg(i);
            addTab(new QLabel(text, this), text);
        }
        mTabBar->setUnsaved(1);
        mTabBar->setUnsaved(3);
        mTabBar->setUnsaved(4);
        mTabBar->setSaved(3);
        mTabBar->setSaved(10);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyle("fusion");
    TabWidget w;
    w.show();
    return a.exec();
}

输出:

完整的例子可以在下面的link找到

【讨论】:

  • 太棒了!非常感谢!您能否添加一些代码以使该单个选项卡也具有不同的背景颜色?我的项目需要它 :-) 非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
相关资源
最近更新 更多