Cannot seem to make toolbar be vertical
-
I have inherited an app with a toolbar on the main window via:
# self == QMainWindow self.toolbar = self.addToolBar("Main")
This gives a horizontal toolbar across the top. I wish to change it to a vertical toolbar down the left-hand side. I know this can be done because if I make the toolbar draggable I can drag it there, but I wish it to be fixed at left-vertical.
Mindful of the available overrides available for
QMainWindow.addToolBar()
, the admonition in http://doc.qt.io/qt-5/qtoolbar.html#orientation-prop of "This function should not be used when the toolbar is managed by QMainWindow. " and having tried to follow https://stackoverflow.com/a/17327905/489865, I have ended up with:self.toolbar = QToolBar() self.toolbar.setWindowTitle("Main") self.toolbar.setOrientation(QtCore.Qt.Vertical) self.addToolBar(QtCore.Qt.LeftToolBarArea, self.toolbar)
(and tried everything in-between), yet my toolbar remains steadfastly horizontal at the top....
(Actions are added to the toolbar after it has been added to the main window, if that makes any difference....)
What is the necessary code for a toolbar to come out vertically at the left, either before
addToolbar()
or after it has been added, please? -
hi
Can it be a python binding issue ?
I took your code in ctor.auto b = new QToolBar(); b->setWindowTitle("OTHER"); b->setOrientation(Qt::Vertical); b->addAction(QIcon(), "TEST"); addToolBar(Qt::LeftToolBarArea, b);
-
@JNBarchan
ofc
auto b = new QToolBar(); b->setWindowTitle("OTHER"); b->setOrientation(Qt::Vertical); addToolBar(Qt::LeftToolBarArea, b); b->addAction(QIcon(), "TEST"); b->addAction(QIcon(), "TEST2");
Qt 5.9. visual stud. compiler
-
@mrjj
Thanks. Sigh. Dunno then what my issue is.Also, if I make my toolbar movable, I can drag the "gripper" to the left, and it looks vertical, but when I release the mouse it "floats" back up to the top & horizontal.....
I'll investigate more tomorrow, I guess....
-
@JNBarchan
No idea, im totally python noob.
one thing i would check
i give it
LeftToolBarArea = 0x1,
enum Orientation {
Horizontal = 0x1,
Vertical = 0x2
};for setOrientation
Is your value the same ?
QtCore.Qt.Vertical -
@mrjj
Thanks. That's OK, I'm a Python/PyQt/Qt noob :) The values for the various enumerations through PyQt are correct.A standalone, 20-line (PyQt) program does work correctly for this. So now I start trying to chop stuff out from the 32K-odd-lines application I have inherited to see if I can get it working there. Wish me luck....
-
@mrjj said in Cannot seem to make toolbar be vertical:
@JNBarchan
Oh, so its related to full app. Well better than in the actual pyQt.BTW, when I get an email notification of that reply of yours it includes a very sweet "Snoopy-good-luck-image" ( :) ), but when I view the post here I see nothing. How does that work? :)
-
@JNBarchan
That sounds really odd.
Maybe browser blocks external images or something?
Its normally visible in forum too.Also your reply have the image
as you can see here
http://imagizer.imageshack.com/img923/8103/gzf3el.png -
@mrjj
Well that too is odd, because I don't see the image under default Firefox from Linux nor IE 11 from Windows.... I do see it under Chrome for Windows... I wonder what the setting is? OTOH, I do see your two "MainWindow" screenshots in all, however... -
@mrjj
Well, good news, and bad news!I wonder whether you would be kind enough to investigate behaviour for me? The underlying problem seems to be to do with saving & restoring main window state, and is a bit weird....
First, starting from scratch my Python code for vertical, left-hand side toolbar is indeed working fine, in itself, just like the C++ code. So that's good.
The stakeholder has now decided that the toolbar is to be
setMovable(True)
after all (but stillsetFloatable(False)
).At this point, I can drag & dock toolbar to all 4 sides fine. As you know, when you drag toolbar main window "expands areas" to visually show where it can be docked, and all 4 are shown.
We save & restore main window layout (see below). If I have dragged toolbar to either left or right vertical all is well, after re-run program and restore toolbar can still be dragged to all 4 positions.
However, if I drag toolbar to either top or bottom horizontal, after re-run program and restore toolbar it is not only possible to drag it to top or bottom, never to left or right, and only the top & bottom areas "expand" to allow drop.
The only way to then rectify this is to delete the saved layout-state
.conf
file externally. Then all reverts to original good behaviour.IMPORTANT EDIT:
Skip all following stuff about save/restore, and go straight to next IMPORTANT EDIT afterward.The code outline is:
-
Take your C++ as starting point.
-
On window close:
QSettings.setValue("main_state", self.saveState())
-
In constructor, after having constructed toolbar & set its options:
mainState = Settings.value("main_state") if mainState: self.restoreState(mainState)
That is what causes this strange behaviour. I'm wondering whether this must somehow to be to do with http://doc.qt.io/qt-5/qtoolbar.html#allowedAreas-prop, because it's as though it's only allowing top & bottom now [EDIT: Just verified
self.toolbar.allowedAreas() == Qt::AllToolBarAreas
always, both before & after any restores.];unless it's something to do with the[EDIT: Just removed thesetOrientation
not supposed to be used withQMainWindow
....setOrientation
completely, doesn't seem to be needed (presumablyaddToolBar(Qt::LeftToolBarArea)
is dealing with this for main window, perhaps why they say don't usesetOrientation
for main window). But no difference for this problem behaviour, so you can try with or without according to me.]My head hurts. If you fancy looking into this you know I'd be most grateful!
IMPORTANT EDIT:
OK, forget about all the stuff to do with saving/restoring. It's not that. Quite simply, look at theQMainWindow::addToolBar(Qt::LeftToolBarArea, toolbar);
:- If you use
Qt::LeftToolBarArea
orQt::RightToolBarArea
, you can drag & drop toolbar to all 4 sides. - But if you use
Qt::TopToolBarArea
orQt::BottomToolBarArea
, you can never drag & drop to left or right side, only top or bottom.
Period. Given that it can support all 4 drag sides after starting at left or right, yet cannot support drag to left or right if starting at top or bottom, is this a bug??
[EDIT: Oh dear, this only appears to be the behaviour in my app, not in standalone test, I'm investigating further...]
-
-
@mrjj
If & when you have time to look at my latest edit to my question, you'll see we can skip anything to do with save/restore. The problem seems to be quite simple now: you cannot reposition a toolbar to left/right if it starts at top/bottom, but you can the other way round.....??[EDIT: Oh dear, oh dear, this is not a problem in the standalone test, only in my actual app. More investigating... :( Any idea at all what might cause this behaviour for me to look at?]