Как настроить вкладку QTabWidget?

Проблема в:

Панель клиента является производной от QTabWidget и имеет несколько вкладок с некоторыми виджетами.

в котором оператор (человек) может редактировать данные. Когда данные изменяются в любом виджете

Я проверяю это и устанавливаю жирный шрифт в QLabel, который является «приятелем» для этого виджета. Я делаю это, устанавливая:

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

Все идет нормально.

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

Это проблема.

Если я установил setFont для виджета, или QTabBar — весь текст, или все вкладки будут помечены
смелый.

В моем классе, который является производным от 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.html а также http://qt.nokia.com/doc/4.5/stylesheet-reference.html и я не нашел решения.

Как получить доступ к определенной вкладке в QTabBar (по ее порядковому номеру) или как установить шрифт: полужирный с таблицей стилей для конкретной вкладки, которая сохраняет жирный шрифт, когда пользователь переключается на другие вкладки?

Заранее спасибо.

3

Решение

Чтобы выполнить эту задачу, мы должны перезаписать 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();
}

Выход:

введите описание изображения здесь

Полный пример можно найти в следующем ссылка на сайт

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]