如何自定义 QTabWidget 选项卡?
How to custom QTabWidget tab?
问题是:
客户面板派生自 QTabWidget,并且有一些带有一些小部件的选项卡
其中操作员(人)可以编辑数据。当任何小部件中的数据发生更改时
我检查了一下,我在 QLabel 中为这个小部件设置了粗体 "buddy"。我通过设置来做到这一点:
QFont fontBold; fontBold.setBold(true);
widget->setFont(fontBold)
到目前为止一切顺利。
接下来我想要有标签,其中有修改和未保存的数据也用粗体标记。即使当用户切换到其他选项卡并留下未保存的数据时,此选项卡仍应以粗体标记,直到他返回并保存数据。
这就是问题所在。
如果我为小部件或 QTabBar 设置 setFont - 所有文本或所有选项卡都被标记
加粗。
在派生自 QTabWidget 的 class 中,我有:
QTabBar *tabBar() const { return QTabWidget::tabBar(); }
所以我可以访问 tabBar,例如使用 setTabTextColor - 用不同的颜色标记这个选项卡 - 这是某种解决方案,但其他 "buddy" 标签用粗体标记,所以 tabText 应该是粗体到.
如果我用setStyleSheet可以做成粗体,但是也有一个问题:
this->tabBar()->setStyleSheet("QTabBar::tab { font:bold }");
如果我使用像 active 这样的伪状态,这会将所有选项卡设置为粗体,
已选择等 - 当用户切换到其他选项卡时它会改变,我需要将此选项卡保持为粗体直到数据被保存。
我可以使用 setProperty,然后为具有特定 属性 的小部件制作样式表,但真正的问题是,我不能,或者不知道如何访问 QTabBar 中的一个选项卡(例如通过知道它的索引号)
我看到,在 QT3 中有 QTab* QTabBar::tab(int) 可以访问特定的选项卡,但这不再可用。我阅读了 http://qt.nokia.com/doc/4.5/stylesheet-examples.html and http://qt.nokia.com/doc/4.5/stylesheet-reference.html 但没有找到解决方案。
如何访问 QTabBar 中的特定选项卡(通过其索引号)或如何使用 styleSheet 为特定选项卡设置 font:bold 当用户切换到其他选项卡时保留粗体字体?
提前致谢。
要执行此任务,我们必须覆盖 paintEvent()
方法以创建继承 QTabBar
.
的 class
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
问题是:
客户面板派生自 QTabWidget,并且有一些带有一些小部件的选项卡
其中操作员(人)可以编辑数据。当任何小部件中的数据发生更改时
我检查了一下,我在 QLabel 中为这个小部件设置了粗体 "buddy"。我通过设置来做到这一点:
QFont fontBold; fontBold.setBold(true);
widget->setFont(fontBold)
到目前为止一切顺利。
接下来我想要有标签,其中有修改和未保存的数据也用粗体标记。即使当用户切换到其他选项卡并留下未保存的数据时,此选项卡仍应以粗体标记,直到他返回并保存数据。
这就是问题所在。
如果我为小部件或 QTabBar 设置 setFont - 所有文本或所有选项卡都被标记 加粗。
在派生自 QTabWidget 的 class 中,我有:
QTabBar *tabBar() const { return QTabWidget::tabBar(); }
所以我可以访问 tabBar,例如使用 setTabTextColor - 用不同的颜色标记这个选项卡 - 这是某种解决方案,但其他 "buddy" 标签用粗体标记,所以 tabText 应该是粗体到.
如果我用setStyleSheet可以做成粗体,但是也有一个问题:
this->tabBar()->setStyleSheet("QTabBar::tab { font:bold }");
如果我使用像 active 这样的伪状态,这会将所有选项卡设置为粗体, 已选择等 - 当用户切换到其他选项卡时它会改变,我需要将此选项卡保持为粗体直到数据被保存。
我可以使用 setProperty,然后为具有特定 属性 的小部件制作样式表,但真正的问题是,我不能,或者不知道如何访问 QTabBar 中的一个选项卡(例如通过知道它的索引号)
我看到,在 QT3 中有 QTab* QTabBar::tab(int) 可以访问特定的选项卡,但这不再可用。我阅读了 http://qt.nokia.com/doc/4.5/stylesheet-examples.html and http://qt.nokia.com/doc/4.5/stylesheet-reference.html 但没有找到解决方案。
如何访问 QTabBar 中的特定选项卡(通过其索引号)或如何使用 styleSheet 为特定选项卡设置 font:bold 当用户切换到其他选项卡时保留粗体字体?
提前致谢。
要执行此任务,我们必须覆盖 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