tags:

views:

99

answers:

1

I've run into some odd behavior with tabified QDockWidgets, below is an example program with comments that demonstrates the behavior.

Is this a bug or is it expected behavior and I'm missing some nuance in QDockWidget that causes this?

Directly, since this does not work, how would one properly "undock" a hidden QDockWidget then display it?

#include <QApplication>
#include <QMainWindow>
#include <QAction>
#include <QDockWidget>
#include <QMenu>
#include <QSize>
#include <QMenuBar>

using namespace std;

int main (int argc, char* argv[])
{
  QApplication app(argc, argv);
  QMainWindow window;
  QDockWidget dock1(&window);
  QDockWidget dock2(&window);
  QMenu menu("View");

  dock1.setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
  dock2.setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);

  dock1.setWindowTitle("Dock One");
  dock2.setWindowTitle("Dock Two");

  window.addDockWidget(Qt::RightDockWidgetArea, &dock1);
  window.addDockWidget(Qt::RightDockWidgetArea, &dock2);
  window.menuBar()->addMenu(&menu);
  window.setMinimumSize(QSize(800, 600));

  window.tabifyDockWidget(&dock1, &dock2);

  dock1.hide();
  dock2.hide();

  menu.addAction(dock1.toggleViewAction());
  menu.addAction(dock2.toggleViewAction());



  window.show();

  // Below is where the oddness starts. It seems to only exhibit the 
  // behavior if the dock widgets are tabified.


  // Odd behavior here
  // This does not work. the window never shows, though its menu action shows
  // checked. Not only does this window not show up, but all toggle actions
  // for all dock windows (e.g. dock1 and dock2) are broken for the duration
  // of the application loop.
  // dock1.setFloating(true);
  // dock1.show();


  // This does work. . . of course only if you do _not_ run the above first.
  // however, you can often get a little lag or "blip" in the rendering as
  // the dock is shown docked before setFloating is set to true.
  dock1.show();
  dock1.setFloating(true);
  return app.exec();
}
+1  A: 

It looks like in case of "setFloating(true)" before showing the window it's still shown but has "off screen" position so you can't see it. Try changing your code to smth like this:

dock1.setFloating(true);
qDebug() << "old size: " << dock1.size() << " old pos: " << dock1.pos();
dock1.resize(QSize(200, 200)); // set new size for the dock window
dock1.move(QPoint(50, 50));    // set new position for the dock window
dock1.show();

I believe this should get your window shown, regards

serge_gubenko
Thanks, this was spot on.
jkyle