QTabWidget, setting colour of tab itself ?
-
@SPlatten said in QTabWidget, setting colour of tab itself ?:
Message has gone, will deploy and test.
I think that error message is due to the initialisation you choose.
Use assignment initialisation instead:TabWidget* pTabWidget = qobject_cast<TabWidget*>(ui->tab_widget);
from what I can tell, the cast isn't needed at all, seems like
ui->tab_widget
is a TabWidget-Pointer in the first place -
@J-Hilk said in QTabWidget, setting colour of tab itself ?:
from what I can tell, the cast isn't needed at all, seems like ui->tab_widget is a TabWidget-Pointer in the first place
Indeed that is the point, so
reinterpret_cast
should not be necessary andqobject_cast
should work (or be made to work as you said). -
@JoeCFD , @JonB , @J-Hilk , I have created very simple test application to test my TabWidget class. I have tried to replicate the project I want to use this functionality in as much as possible, a snippet from the UI:
<widget class="TabWidget" name="tab_widget"> <property name="font"> <font> <pointsize>12</pointsize> <weight>75</weight> <bold>true</bold> </font> </property> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="overall_tab"> <property name="focusPolicy"> <enum>Qt::TabFocus</enum> </property> <attribute name="title"> <string>&Overall</string> </attribute> <layout class="QGridLayout" name="gridLayout_23"> <item row="0" column="0"> <widget class="QFrame" name="overall_frame">
Unfortunately I am not able to get the entire file to post as the development system is locked down. In my test project everything works find and I am able to change the colour of the tab which I do with:
void paintEvent(QPaintEvent* pEvt) { Q_UNUSED(pEvt); int intTabs(count()); if ( intTabs == 0 ) { return; } QStylePainter painter(this); for( int intTab=0; intTab<intTabs; intTab++ ) { QStyleOptionTab opt; initStyleOption(&opt, intTab); const char* cpszProperty(opt.text.toLatin1().data()); QVariant varProperty(property(cpszProperty)); if ( varProperty.isValid() == true ) { bool blnState(varProperty.toBool()); if ( blnState == true ) { QColor color(kErrorColour); opt.palette.setColor(QPalette::Button, color); } //Edit#1, Just add the 5 lines below, compiling and trying out QWidget* pTabButton(tabButton(intTab, QTabBar::LeftSide)); if ( pTabButton ) { pTabButton->setStyleSheet(QString("background-color: rgb(%1,%2,%3)") .arg(color.red()).arg(color.green()).arg(color.blue()); } } painter.drawControl(QStyle::CE_TabBarTabShape, opt); painter.drawControl(QStyle::CE_TabBarTabLabel, opt); } }
I can see that the loop is paintEvent is being called and it iterates through the loop with the colour being set, but the colour is not displayed.
The test application works perfectly, however the same code in the actual project does not.
Is there anything I can do to find out why it isn't working?
[Edit#2] Edit#1 didn't resolve anything, still doesn't work.
-
@JoeCFD , @JonB , @J-Hilk Still working on this...the current paintEvent function:
void paintEvent(QPaintEvent* pEvt) { Q_UNUSED(pEvt); int intTabs(count()); QStylePainter painter(this); for( int intTab=0; intTab<intTabs; intTab++ ) { QStyleOptionTab opt; initStyleOption(&opt, intTab); const char* cpszProperty(opt.text.toLatin1().data()); QVariant varProperty(property(cpszProperty)); bool blnValid(varProperty.isValid()); if ( blnValid == true ) { bool blnState(varProperty.toBool()); if ( blnState == true ) { QColor color(kErrorColour); if ( color.isValid() ) { opt.palette.setColor(QPalette::Button, color); } } } painter.drawControl(QStyle::CE_TabBarTabShape, opt); painter.drawControl(QStyle::CE_TabBarTabLabel, opt); } }
What I am seeing is that blnValid is always false and the text member in opt never matches any of the tabs. Why could this be?
In my test application the problem does not exist, so it has to be some I have failed to do.
-
@JoeCFD , @JonB , @J-Hilk , I've progressed this to the point where it gets all the way to:
opt.palette.setColor(QPalette::Button, color);
I output the color to the log file and its valid and the name() returns #ff0000. But still the colour of the tab doesn't change, again in my standard alone test project it does the same and in this it works...so why doesn't it work here?
-
-
@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.