[solved]showing and hiding QDockWidget problem
-
i am creating a floating dockwidget with a qtoolbar as a child widget
@ toolsDock = new QDockWidget(this);
toolsBar = new QToolBar(this);toolsBar->setOrientation(Qt::Vertical); toolsBar->addAction(ui->actionSelect); toolsBar->addAction(ui->actionPolygon); toolsBar->addAction(ui->actionBrush); toolsBar->addAction(ui->actionErazer); toolsBar->addSeparator(); toolsBar->addAction(ui->actionMark); toolsBar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); toolsDock->setStyleSheet("QDockWidget { font: bold }"); toolsDock->setFloating(true); toolsDock->setFeatures(QDockWidget::DockWidgetVerticalTitleBar | QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); QAbstractButton *floatButton = toolsDock->findChild<QAbstractButton*>("qt_dockwidget_floatbutton"); if(floatButton) floatButton->hide(); toolsDock->setAllowedAreas( Qt::NoDockWidgetArea ); toolsDock->setWindowTitle("Tools"); toolsDock->setWidget(toolsBar); toolsDock->close();@
the dockwidget starts as hiden. The problem then is that if afterwards try to show the dockwidget with
@toolsDock->show();@
i can't it is all the time hidden, but if i start the dockwidget as not hidden then i can show/hide it as i demand.
could someone explain me what i am missing
thanks -
@broadpeak i have tried all these combinations as well (i.e. hide()/show(), sethidden(true)/sethidden(false), setvisible(true)/setvisible(false)) and all these are working only if i do not start my dockwidget as hidden, otherwise the dockwidget does not appear although that i can see with the isheaden() that the dockwidget is hidden
i am missing something else but i cannot understand what.
-
My solution which is working:
(I use in my app 9 dockwidget, and I have only dockwidgets in the mainwindow)@
void MainWindow::createDockWindows()
{// invisible centralwidget! this is very important if you have only dockwidgets without central widget !!!!!!!! QWidget* cw = new QWidget(this); setCentralWidget(cw); this->centralWidget()->hide(); videoMonitorGridDW = new VMGridDockWidget(); videoMonitorGridDW->setAllowedAreas(Qt::AllDockWidgetAreas); videoMonitorGridDW->setFeatures(VMGridDockWidget::NoDockWidgetFeatures); videoMonitorGridDW->setParent(this); addDockWidget(Qt::LeftDockWidgetArea, videoMonitorGridDW);
...
skinDW = new SkinDockWidget();
skinDW->setAllowedAreas(Qt::AllDockWidgetAreas);
skinDW->setFeatures(SkinDockWidget::NoDockWidgetFeatures);
skinDW->setParent(this);
addDockWidget(Qt::LeftDockWidgetArea, skinDW);
skinDW->hide();this->tabifyDockWidget(videoMonitorGridDW, displayListDW);
videoMonitorGridDW->raise();
}void MainWindow::setCameraPerspective()
{skinDW->hide(); displayListDW->show();
...
exportDW->show();
eventDW->raise();
}@
-
the strange thing is that i am getting the state of the dockwidget with the isHeaden() and it seems to work properly but the dock is not appearing on the screen while it should be...
i am calling the dockwidget->show() through a slot, if that makes any difference
-
According to QDockWidget doc:
try to look after that your dockwidget has a parent or child widget
(
http://qt-project.org/doc/qt-4.8/qwidget.html#isVisibleTo
or
http://qt-project.org/doc/qt-4.8/qwidget.html#isHidden
)And yes, your dockwidget's behaviour is very strange....
(I use QT 4.8.3 and works perfectly with dockwidgets)Question, this: toolsDock->setWidget(toolsBar); is real? There is a setTitleBarWidget function too...
-
what do you mean by if this: toolsDock->setWidget(toolsBar); is real?
with that way i am adding the QToolBar widget to the QDockWidget, so the toolbar is a child widget of the dock window is it a wrong way to do it?i tried also to modify my code and instead of using toolsDock->setWidget(toolsBar); i change it to toolsDock->setTitleBarWidget(toolsBar); and that works as it is supposed to but the dock window is bigger, without title, and in general not fixed as it was before.
Any suggestion is welcome, sorry for my naive questions but i am a newbie in qt.
-
to show you the behavior try to run this example:
mainwindow.h
@#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QtGui>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{
Q_OBJECTpublic:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:void showDock();
private:
Ui::MainWindow *ui;QDockWidget *dock; QPushButton *button;
};
#endif // MAINWINDOW_H@
mainwindow.cpp
@#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);// QMainWindow mainWindow;
// QDockWidget *dock = new QDockWidget(&mainWindow);
dock = new QDockWidget(this);dock->setStyleSheet("QDockWidget { font: bold }"); dock->setFloating(true); dock->setFeatures(QDockWidget::DockWidgetVerticalTitleBar | QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); QAbstractButton *floatButton = dock->findChild<QAbstractButton*>("qt_dockwidget_floatbutton"); if(floatButton) floatButton->hide(); dock->setAllowedAreas( Qt::NoDockWidgetArea ); dock->setWindowTitle("Tools"); this->addDockWidget(Qt::TopDockWidgetArea, dock, Qt::Vertical); QMainWindow *window = new QMainWindow(0); window->setWindowFlags(Qt::Widget); QToolBar *bar = new QToolBar(window); bar->setMovable(false); bar->addAction("Select"); bar->addAction("Polygon"); bar->addAction("Brush"); bar->addAction("Erazer"); bar->addSeparator(); bar->addAction("Mark"); bar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); bar->setOrientation(Qt::Vertical); window->addToolBar(Qt::LeftToolBarArea, bar); window->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); window->setParent(dock); dock->setWidget(window);
// dock->hide();
button = new QPushButton("show", this); button->setCheckable(true); QObject::connect(button, SIGNAL(clicked()), this, SLOT(showDock()));
}
MainWindow::~MainWindow()
{
delete ui;
}void MainWindow::showDock()
{
// qDebug() << "hello";
if(button->isChecked()){
if(dock->isHidden()){
qDebug() << "hidden";
dock->show();
}
}if(!button->isChecked()){ if(!dock->isHidden()){ qDebug() << "not hidden"; dock->hide(); } }
}@
and try to run it with commented and uncomment the line 45, i do not understand why it is not working if i start the dockwidget hidden....
-
i modified the mainwindow.cpp file and now seems to work properly
mainwindow.cpp
@#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);// QMainWindow mainWindow;
// QDockWidget *dock = new QDockWidget(&mainWindow);
QDialog *dockDialog = new QDialog(this); // <-----added a parent widget for the dock
dock = new QDockWidget(dockDialog);dock->setStyleSheet("QDockWidget { font: bold }"); dock->setFloating(true); dock->setFeatures(QDockWidget::DockWidgetVerticalTitleBar | QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); QAbstractButton *floatButton = dock->findChild<QAbstractButton*>("qt_dockwidget_floatbutton"); if(floatButton) floatButton->hide(); dock->setAllowedAreas( Qt::NoDockWidgetArea ); dock->setWindowTitle("Tools"); this->addDockWidget(Qt::TopDockWidgetArea, dock, Qt::Vertical); QMainWindow *window = new QMainWindow(dock); // <--- set as parent widget for the window the dock window->setWindowFlags(Qt::Widget); QToolBar *bar = new QToolBar(window); bar->setMovable(false); bar->addAction("Select"); bar->addAction("Polygon"); bar->addAction("Brush"); bar->addAction("Erazer"); bar->addSeparator(); bar->addAction("Mark"); bar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); bar->setOrientation(Qt::Vertical); window->addToolBar(Qt::LeftToolBarArea, bar); window->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); window->setParent(dock); dock->setWidget(window); dock->hide(); button = new QPushButton("show", this); button->setCheckable(true); QObject::connect(button, SIGNAL(clicked()), this, SLOT(showDock()));
}
MainWindow::~MainWindow()
{
delete ui;
}void MainWindow::showDock()
{
// qDebug() << "hello";
if(button->isChecked()){
if(dock->isHidden()){
qDebug() << "hidden";
dock->setFloating(true); // <---- setting some features again, although i have specified that in the initiliazation, otherwise it is shown inside the mainwindow
QAbstractButton floatButton = dock->findChild<QAbstractButton>("qt_dockwidget_floatbutton"); // <--- discarding the floating button, again
if(floatButton)
floatButton->hide();dock->show(); } } if(!button->isChecked()){ if(!dock->isHidden()){ qDebug() << "not hidden"; dock->hide(); } }
}@
this does what i want and it seems to work properly, i do not know if it is the proper way to do it, but it works. If someone has a better solution, i would be glad to see it.
Thanks