Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Widget under a QTabBar with unwanted frame

Tags:

c++

qt

qt4

I have a problem with QTabBar/QTabWidget. This is what my program looks like at the moment, using QTabBar:

enter image description here

As you can see, there is an unsightly line between the QTabBar and the QScrollArea underneath it. This line is part of the frame of the QScrollArea, which I can't simply get rid of, because it is required on the other three sides. I realise I could use QTabWidget, but then I would have to create a widget for each tab, which is not feasible here: the contents of the QScrollArea change according to the selected tab, but there is only one QScrollArea widget. (Duplicating it each time a new tab is created would cause its own problems.)

So does anybody know a way to either:
(i) tell the QScrollArea to draw a frame without the top line; or
(ii) use the same widget for each tab in a QTabWidget?

Update 3 For another approach, see my answer below.

Update 1 I have implemented zvezdi's suggestion, and the unsightly line has disappeared:

enter image description here

This is an improvement. But it's not right. Look at the gaps between the scroll bars and the border. On the right, it's two pixels instead of one; on the bottom, it's three pixels. And the gap on the right between the QScrollArea border and the mainWidget border is one pixel too big. This is due to QTabWidget's border style, which I am losing my sanity trying to change. If I say:

MyTabWidget -> setStyleSheet ("QTabWidget::pane { margin: 0px,0px,0px,0px }") ;

then the margins seem to be right, but the borders disappear:

enter image description here

If I say:

MyTabWidget -> setStyleSheet ("QTabWidget::pane { "
  " margin: 0px,0px,0px,0px;"
  " border: 1px solid darkgray;"
  "}") ;

then I'm almost back to where I started:

enter image description here

If I try to remedy this with:

ApplicationTabWidget -> setStyleSheet ("QTabWidget::pane { "
"   margin: 0px,0px,0px,0px;"
" border: 1px solid darkgray;"
" border-top: 0px;"
      "}") ;

then again I am mocked for my pains:

enter image description here

Update 2 If I forget setStyleSheet and just turn documentMode on, this is what I get:

enter image description here

Please somebody, tell me I'm being stupid, and there's a perfectly simple solution to all this.

like image 465
TonyK Avatar asked May 30 '11 21:05

TonyK


2 Answers

You said "the contents of the QScrollArea change according to the selected tab" well if I assume that this is not true, and what you mean is that the content of the widget that is inside the scroll area changes, then you can try this:

Make as many QScrollArea objects as many tabs you need in your QTabWidget, but only one, for example QTextEdit, which you will show in every scroll area, and which content will change on tab change (takeWidget() from the old tab's QScrollArea & setWidget() on the new tab's QScrollArea)

I don't know how you've designed your code, but to try my suggestion your code should be designed around the widget inside QScrollArea, rather than the QScrollArea itself.

like image 134
zkunov Avatar answered Nov 12 '22 20:11

zkunov


Unless I misunderstand, if you turn off the QScrollArea's border by setting the frameShape to NoFrame, the tab widget still has its frame lines on the sides and the bottom where you want them.

like image 2
Arnold Spence Avatar answered Nov 12 '22 22:11

Arnold Spence