如何自定义QTabWidget选项卡?

5
问题是:
客户面板派生自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 }");

这将设置所有带有粗体文本的选项卡,如果使用类伪状态如active、selected等,则在用户切换到其他选项卡时会更改,我需要保持此选项卡为粗体,直到数据保存。
我可以使用setProperty然后为具有特定属性的小部件制作样式表,但真正的问题是,我无法访问QTabBar中的一个选项卡(例如通过知道它的索引号)。
我看到QT3中有QTab * QTabBar :: tab(int),它可以访问特定的选项卡,但现在不再可用。我阅读了{{link1:http://qt.nokia.com/doc/4.5/stylesheet-examples.html}}和{{link2:http://qt.nokia.com/doc/4.5/stylesheet-reference.html}},但没有找到解决方案。
如何访问QTabBar中的特定选项卡(按其索引号),或如何为保留粗体字体的特定选项卡设置font:bold样式表,即使用户切换到其他选项卡?
提前致谢。

请测试我的答案,如果它有效,请不要忘记将其标记为正确。 - eyllanesc
1个回答

6
为了执行这个任务,我们必须重写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();
}

输出:

在此输入图片描述

完整示例可在以下链接中找到。


太棒了!非常感谢!您能添加一些代码,使该个别选项卡也具有不同的背景颜色吗?我需要这个来完成我的项目 :-) 非常感谢。 - K.Mulier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接