QTabWidget, setting colour of tab itself ?
-
@SPlatten
So did you tryQTabWidget::tab-bar
as shown in Customizing QTabWidget and QTabBar? It seems to me the examples there should cover you, please try minimal example if you say it does not work. -
This will work. I tested it.
QString style_sheet = QString("QTabBar::tab{background: green; color: white;padding: 10px;}"
"QTabBar::tab:selected{ background: lightgray; }" );
setStyleSheet( style_sheet );@JoeCFD , as stated before I am using Qt 4.8, with QTabWidget.
@JonB , I've tried modifying the styleSheet property in Qt Creator and I've only managed to change the background colour of the pane, not the tab.
[Edit] @JoeCFD , @JonB , success, thank you, I went back into Qt Creator, selected the QTabWidget and have set the styleSheet property for the tab widget to:
QTabBar::tab::selected, QTabBar::tab::hover {background-color:#ff0000;}
-
@JoeCFD , @JonB , unfortunately the requirement has now changed....each tab contains other controls. If any of the controls contain in the tab panels are in a specific fault state then the requirement is to make the tab background red to reflect this, so the user is highlighted that the content of the tab are in the fault state.
How can I do this so that multiple tabs may be in the fault (red background) state?
-
@JoeCFD , @JonB , unfortunately the requirement has now changed....each tab contains other controls. If any of the controls contain in the tab panels are in a specific fault state then the requirement is to make the tab background red to reflect this, so the user is highlighted that the content of the tab are in the fault state.
How can I do this so that multiple tabs may be in the fault (red background) state?
@SPlatten you can try it via custom dynamic properties and stylesheets
I'm not sure how much of that is already supported in Qt4, you'll have to find out :D
-
@SPlatten you can try it via custom dynamic properties and stylesheets
I'm not sure how much of that is already supported in Qt4, you'll have to find out :D
-
@J-Hilk , how would this work? I've tried various styles in Qt Creator but I can't managed to get the tab background colour changed, keep in mind that there could be several tabs with a different background colour.
admittedly one has no direct access to the "Tab" but we can cheat/abuse already existing functions:
for example:
QTabBar::tab [whatsThis="aTabWithErrors"]{ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); border: 2px solid #C4C4C3; border-bottom-color: #C2C7CB; /* same as the pane color */ border-top-left-radius: 4px; border-top-right-radius: 4px; min-width: 8ex; padding: 2px; }
than:
ui->myTabwidget->tabBar()->setTabWhatsThis(0, "aTabWithErrors");
-
admittedly one has no direct access to the "Tab" but we can cheat/abuse already existing functions:
for example:
QTabBar::tab [whatsThis="aTabWithErrors"]{ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); border: 2px solid #C4C4C3; border-bottom-color: #C2C7CB; /* same as the pane color */ border-top-left-radius: 4px; border-top-right-radius: 4px; min-width: 8ex; padding: 2px; }
than:
ui->myTabwidget->tabBar()->setTabWhatsThis(0, "aTabWithErrors");
-
@J-Hilk , I don't understand the syntax of what you have posted, what is setTabWhatsThis ?
@SPlatten its a function of QTabBar
https://doc.qt.io/qt-6/qtabbar.html#setTabWhatsThisI checked its also part of the qt4 QTabBar class.
-
@SPlatten its a function of QTabBar
https://doc.qt.io/qt-6/qtabbar.html#setTabWhatsThisI checked its also part of the qt4 QTabBar class.
-
@SPlatten its a function of QTabBar
https://doc.qt.io/qt-6/qtabbar.html#setTabWhatsThisI checked its also part of the qt4 QTabBar class.
-
@J-Hilk , just tried this and getting:
error: `QTabBar* QTabWidget::tabBar() const' is protected
The line where this error occurs:
ui_->tab_widget->tabBar()->setTabWhatsThis((int)tabIndex, style);
@SPlatten well, I can't reproduce that, this compiles just fine:
QApplication a(argc, argv); QTabWidget tabWidget; tabWidget.setStyleSheet("QTabBar::tab[whatsThis=\"aTabWithErrors\"]{" "background-color: darkred;}"); tabWidget.addTab(new QWidget(), "SomeTab"); tabWidget.addTab(new QWidget(), "SomeOtherTab"); tabWidget.show(); auto tabbar = tabWidget.tabBar(); tabbar->setTabWhatsThis(1,"aTabWithErrors"); qDebug() << tabWidget.tabBar()->tabWhatsThis(0); qDebug() << tabWidget.tabBar()->tabWhatsThis(1); return a.exec();
but I do not get it to work. It works fine with a QPushButton, but not with the tab.
QPushButton btn; btn.setStyleSheet("QPushButton[whatsThis=\"aTabWithErrors\"]{background-color:darkred;}"); btn.setWhatsThis("aTabWithErrors"); btn.show();
-
@JoeCFD , @J-Hilk , looking at: https://www.w3schools.com/cssref/css_selectors.asp
Is there a syntax that would allow me to use something like:
QTabBar::tab[id*="c2_tab"] { background-color: #ff0000; }
Where id is the objectName.
@SPlatten said in QTabWidget, setting colour of tab itself ?:
Where id is the objectName.
that works too, if you can get access to the tab, to set the objectname ? I'm not sure it has one by default.
-
@SPlatten well, I can't reproduce that, this compiles just fine:
QApplication a(argc, argv); QTabWidget tabWidget; tabWidget.setStyleSheet("QTabBar::tab[whatsThis=\"aTabWithErrors\"]{" "background-color: darkred;}"); tabWidget.addTab(new QWidget(), "SomeTab"); tabWidget.addTab(new QWidget(), "SomeOtherTab"); tabWidget.show(); auto tabbar = tabWidget.tabBar(); tabbar->setTabWhatsThis(1,"aTabWithErrors"); qDebug() << tabWidget.tabBar()->tabWhatsThis(0); qDebug() << tabWidget.tabBar()->tabWhatsThis(1); return a.exec();
but I do not get it to work. It works fine with a QPushButton, but not with the tab.
QPushButton btn; btn.setStyleSheet("QPushButton[whatsThis=\"aTabWithErrors\"]{background-color:darkred;}"); btn.setWhatsThis("aTabWithErrors"); btn.show();
@J-Hilk said in QTabWidget, setting colour of tab itself ?:
@SPlatten well, I can't reproduce that, this compiles just fine:
auto tabbar = tabWidget.tabBar();
At Qt 5 this is fine. But at Qt4 (which is what the OP is using) the only doc reference I can find now Googling is https://het.as.utexas.edu/HET/Software/html/qtabwidget.html#tabBar, and that has
QTabBar * QTabWidget::tabBar () const [protected]
So at Qt4 it was
protected
..., per the OP's error message! So @SPlatten if you want/need to use the code you have been shown as-is, looks like you will need to subclassQTabWidget
so as to gain access toQTabWidget::tabBar()
. (Or maybetabWidget->findChild<QTabBar *>()
would work for you to avoid subclassing.) -
@J-Hilk said in QTabWidget, setting colour of tab itself ?:
@SPlatten well, I can't reproduce that, this compiles just fine:
auto tabbar = tabWidget.tabBar();
At Qt 5 this is fine. But at Qt4 (which is what the OP is using) the only doc reference I can find now Googling is https://het.as.utexas.edu/HET/Software/html/qtabwidget.html#tabBar, and that has
QTabBar * QTabWidget::tabBar () const [protected]
So at Qt4 it was
protected
..., per the OP's error message! So @SPlatten if you want/need to use the code you have been shown as-is, looks like you will need to subclassQTabWidget
so as to gain access toQTabWidget::tabBar()
. (Or maybetabWidget->findChild<QTabBar *>()
would work for you to avoid subclassing.) -
@JoeCFD , @JonB , unfortunately the requirement has now changed....each tab contains other controls. If any of the controls contain in the tab panels are in a specific fault state then the requirement is to make the tab background red to reflect this, so the user is highlighted that the content of the tab are in the fault state.
How can I do this so that multiple tabs may be in the fault (red background) state?
@SPlatten Ideally it may be better to flash a tiny icon on the tab. For this you may need to customize your tab and it can take long for you make it. You can simply check the source code of qtabwidget and qtabbar and borrow some. But sure you can reset the tab color with style sheet like
warning: yellow; fatal: red. -
@SPlatten Ideally it may be better to flash a tiny icon on the tab. For this you may need to customize your tab and it can take long for you make it. You can simply check the source code of qtabwidget and qtabbar and borrow some. But sure you can reset the tab color with style sheet like
warning: yellow; fatal: red. -
@SPlatten I can explain the concept to you, but can not give you code. You create a tabbar class to inherit qtabbar and add it to qtabwidget. Define or add your tabs(a class tab with text and icons) to tabbar and override paintEvent in tabbar to paint all tabs. Then you can add a timer to tab class to hide or display or toggle icons when needed.
QTabBar source code is here:
https://code.woboq.org/qt5/qtbase/src/widgets/widgets/qtabbar.cpp.html -
@SPlatten I can explain the concept to you, but can not give you code. You create a tabbar class to inherit qtabbar and add it to qtabwidget. Define or add your tabs(a class tab with text and icons) to tabbar and override paintEvent in tabbar to paint all tabs. Then you can add a timer to tab class to hide or display or toggle icons when needed.
QTabBar source code is here:
https://code.woboq.org/qt5/qtbase/src/widgets/widgets/qtabbar.cpp.html -
@SPlatten I can explain the concept to you, but can not give you code. You create a tabbar class to inherit qtabbar and add it to qtabwidget. Define or add your tabs(a class tab with text and icons) to tabbar and override paintEvent in tabbar to paint all tabs. Then you can add a timer to tab class to hide or display or toggle icons when needed.
QTabBar source code is here:
https://code.woboq.org/qt5/qtbase/src/widgets/widgets/qtabbar.cpp.html@JoeCFD , hello, I'm trying to do this today, but not sure quite where to start. I have code already existing which I didn't write, the existing code uses a QTabWidget in the UI. Each tab is defined in the UI as QWidget.
Do I replace the QWidget with my own implementation? Is there a tutorial that could help me or guide me through this process ?
I'm getting confused by the online documentation for QTabWidget and QTabBar:
https://doc.qt.io/qt-6/qtabwidget.html
QTabWidget Class
The QTabWidget class provides a stack of tabbed widgets.https://doc.qt.io/qt-6/qtabbar.html
QTabBar Class
The QTabBar class provides a tab bar, e.g. for use in tabbed dialogs.I want to implement a tab where I can set the background colour according to my own logic.
I found this:
https://stackoverflow.com/questions/46137500/qt-tabwidget-each-tab-title-background-colorI am trying to tailor it to my problem....the issue I'm having now is that the tabs are already defined in the UI. How can I apply this logic to the tabs that are already defined in the UI ?