QTabWidget, setting colour of tab itself ?
-
@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 -
@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 ?
-
@J-Hilk , @JonB , @JoeCFD , This is the current issue or at least one issue:
The UI contained an instance of QTabWidget. This was set-up to contain the following tabs:
&Overall C&2 &CGU &LMS &PDLT &NLA P&GU &HCU &UPSD &Sensors
In the XML file these tabs were defined with the class as QWidget I have edited the XML file and changed instances of QTabWidget to TabWidget and the tabs from QWidget to TabBar which matches the names of the new implementation I am trying to use.
However I'm not sure why or what I need to do in order to transfer the tabs from the UI into the class I am using so I can use the colours that the replacement class is going to allow?
-
@J-Hilk , @JonB , @JoeCFD , a snippet from the UI file:
<widget class="TabWidget" name="tab_widget"> <property name="font"> <font> <pointsize>12</pointsize> <weight>75</weight> <bold>true</bold> </font> </property> <property name="styleSheet"> <string notr="true"/> </property> <property name="currentIndx"> <number>0</number> </property> <widget class="TabBar" nam="overall_tab"> <property name="focusPolicy"> <enum>Qt::TabFocus</enum> </property> <attribute name="title"> <string>&Overall</string> </attribute> ....
I can see in my log output that the constructor for the TabBar is called for each instance of the TabBar in the UI file. Can I determine from the constructor call what the title attribute is ?
-
@SPlatten
Constructor of what?As far as I can see code must call either
QTabWidget::setTabText(int index, const QString &label)
,QTabWidget::addTab(QWidget *page, const QString &label)
orQTabBar::setTabText(int index, const QString &text)
. These are all individual calls, there is no "constructor" which takes the tab text/title as a parameter. Nor are any of the methodsvirtual
. I imagine an explicit call is made to one of these after whatever construction. So does that answer your question as "No"?Meanwhile you can also look in the
uic
-generatedui_....h
file for the actual code used to execute what it reads from the.ui
file, if that helps clarify. -
@JonB , the default constructor of the TabBar is being called I assume when the UI file is parsed?
class TabBar : public QTabBar { private: QHash<QString, QColor> colors_; protected: void paintEvent(QPaintEvent* evt) { ... } public: TabBar(QWidget* parent = 0) : QTabBar(parent) { ... } ... }
-
@JonB , from ui_...h file:
overall_tab = new TabBar(); overall_tab->setObjectName(QString::fromUtf8("overall_tab"));
Some where nearer the end of file in the function retranslateUi there is a call to:
tab_widget->setTabText(tab_widget->indexOf(overall_tab), QApplication::translate("::wsStatusPage", "&Overall", 0, QApplication::UnicodeUTF8));
Its all a bit fragmented...is there anything I can do to the UI file that will help me to identify the tab when the constructor is called?
I'm reworking this code, as it isn't well written and doesn't follow the correct way of doing things, hopefully this will lead to a solution.
-
@SPlatten said in QTabWidget, setting colour of tab itself ?:
is there anything I can do to the UI file that will help me to identify the tab when the constructor is called?
Nope. As you can see, the tab text is not set until that
tab_widget->setTabText()
is called, much later than construction. That's how it implements the instructions from the.ui
file.At least in terms of the tab's text/title, which is what you say you want to know.
And once again anyway (not that it helps): "the constructor" of what are you asking about?
QTabWidget
?QTabBar
? Tabs are not even constructed until after both of these anyway. -
@SPlatten said in QTabWidget, setting colour of tab itself ?:
I have edited the XML file and changed instances of QTabWidget to TabWidget and the tabs from QWidget to TabBar
class TabBar : public QTabBar
BTW, what is going on here? You confuse me (not for the first time!). A
QTabWidget
is supposed to have oneQTabBar
and a number ofQWidget
s for the widgets/contents/tabs of each page; one page per item in the tab bar. You have changed so that yourQTabWidget
has aQTabBar
as each of its widgets/pages/tabs?? -
@JonB , to be honest, I'm confused by the implementation I have downloaded, I was looking online for an implementation that allows me to set the colours of the tabs and I found the source I'm using, this does appear to use a TabBar for each tab, please take a look at the source I posted in my earlier posts.
I'm looking at it again as I may have goofed it up.