QTabWidget, setting colour of tab itself ?
-
-
@JoeCFD said in QTabWidget, setting colour of tab itself ?:
@SPlatten Good idea. Try to change the texts to see if it works.
I've modified the code where it sets the colour to also change the tab text:
setTabText(intTab, "modified: " + tabText(intTab));
[Edit] With this code in place I can see that no tab text is modified, which makes me wonder what is going on, the tabs show the same as defined in the UI file, but it appears they aren't the same in that they cannot be modified???
-
@JoeCFD , so now I'm looking at why this is the case and what I can do to fix it.
[Edit] I removed this:
<header location="global">ws_status_page.h</header>
From the customWidget defining the class TabWidget and now the modified text is visible, although when I applied the modified text to the project that the colours work in, the colours don't work while the text is modified, so I'm now rebuilding and testing without modified text...
[Edit#2] Sadly having removed the code that modified the text the colour still isn't set. But this does still work in the other project when I removed the modified text.
-
@JonB , @JoeCFD , @J-Hilk I'm still working on this and trying to find a solution, in the test project I created I've added to the end the TabBar::paintEvent function:
QPen objPen(QColor("#ffff00")); objPen.setWidth(3); painter.setPen(objPen); painter.drawLine(0,0,100,100);
Having cleaned and rebuilt both projects I can see the thick yellow diagonal line drawn in both projects, but only the prototype I created has the tabs drawn with a red background.
-
@SPlatten I still suspect that not the right tab is called. You do need to check their pointer addresses match exactly. Try to make only one tab in your project for testing. If this is confirmed, you need to dig into the source code to check what can block the change of color. There must be some flags for this.
-
@SPlatten said in QTabWidget, setting colour of tab itself ?:
initStyleOption
Can you make a debug build of Qt? Then build your project in debug mode and you can easily check into the source code to see what is going on? There must some tiny change which is missing. You are so close now.
-
@JoeCFD , at this point I'm out of ideas as to why it isn't working, at a guess I would say the paintEvent is not using the correct painter which means the "this" context isn't correct.
In "my" own project I created using the UI from the project that doesn't work, I have a working set of tabs where I can set the tab colours using flags and the paintEvent which is identical to the source in the project that doesn't work.
I've looked very carefully at everything I can and I just can't see where the issue is.
Project that works, mainwindow.ui contains:
centralWidget QFrame tab_widget overall_tab more tabs...
The bottom of the UI file contains:
<customwidgets> <customwidget> <class>TabWidget</class> <extends>QTabWidget</extends> <header>tabwidget.h</header> <container>1</container> </customwidget> </customwidgets>
Project that doesn't work, has the same structure as the project that does work. Any suggestions welcome.
-
@SPlatten suggestion,
- make a backup :D
- remove the not working class entirely, cpp, h and ui file
- replace the removed files with the ones from your working example
- adjust the api with dummy functions so it compiles
- see if it works as expected
- if it does add functionality from old file back in, and regular check if it still works
-
@J-Hilk , thank you, that's a massive job in itself...is there any tracing I can add to the paintEvent in the tabBar to see why one works and the other doesn't....
I'm going to compromise and try to use pre-processors to comment out sections of the CPP, rebuild and see if that works, commenting out almost everything to begin with.
-
@JoeCFD , @J-Hilk , its stranger and stranger, here is the paintEvent function:
void paintEvent(QPaintEvent* pEvt) { QStylePainter painter(this); int intTabs(count()); for( int i=0; i<intTabs; i++ ) { QString strTabKey(strKey(i)); QStyleOptionTab opt; initStyleOption(&opt, i); tFaultsMap::const_iterator citFound(mmpFaults.find(strTabKey)); if ( citFound != mmpFaults.constEnd() ) { QColor color(citFound->value()); const int cintBlue(color.blue()); const int cintRed(color.red()); color.setBlue(cintRed); color.setRed(cintBlue); //This only works in the project I've created not the original opt.palette.setColor(QPalette::Button, color); //Change tab text, this works opt.text = "HACK"; } painter.drawControl(QStyle::CE_TabBarTabShape, opt); painter.drawContorl(QStyle::CE_TabBarTabLabel, opt); } Q_UNUSED(pEvt); }
Is there anything special I need to do in order to adjust the palette? As changing the text works.
[Edit] In searching for a solution on Google I found a suggestion to set the Fusion style:
QApplication::setStyle("Fusion");
I added this to the TabBar constructor, rebuilt and deployed, when the form is displayed the application now crashes.
[Edit#2] It wasn't this that caused the crash but another modification I made at the same time.
[Edit#3] I have read online that using the palette to set the colour isn't reliable and instead to use the style sheet. I would like to try this but:
QWidget* pobjTabButton(tabButton(i, QTabBar::LeftSide));
tabButton returns NULL, this is being called in a loop in the paintEvent where the iterations of the loop is determined by the count function. Why would tabButton return NULL when there are tabs set-up ?
Why is this so tricky? I can't get anything except NULL returned by tabButton, without the widget I cannot try setStyleSheet and the other just doesn't work (In one project at least).
-
@SPlatten said in QTabWidget, setting colour of tab itself ?:
QStyleOptionTab
That is why I told you to check the pointers of tabs. When they are created, print their addresses to the screen. Then check their pointers here as well to make sure the same tabs are handled. Here, I mean tab buttons.