Проблема в:
Панель клиента является производной от 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 (по ее порядковому номеру) или как установить шрифт: полужирный с таблицей стилей для конкретной вкладки, которая сохраняет жирный шрифт, когда пользователь переключается на другие вкладки?
Заранее спасибо.
Чтобы выполнить эту задачу, мы должны перезаписать 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();
}
Выход:
Полный пример можно найти в следующем ссылка на сайт
Других решений пока нет …