Dock panels glitching out
-
So I just started out with Qt widgets and I'm trying to get a basic QDockWidget setup running. However, as you can see in the video, when I first launch the app, the dock panels glitch/teleport when I try to move them. But after I undock and redock them, everything works fine. Has anyone encountered this before or know the proper way to set this up? Thanks!
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // Set the Fusion style for better cross-platform appearance QApplication::setStyle(QStyleFactory::create("Fusion")); // Apply dark theme QPalette darkPalette; darkPalette.setColor(QPalette::Window, QColor(53, 53, 53)); darkPalette.setColor(QPalette::WindowText, Qt::white); darkPalette.setColor(QPalette::Base, QColor(25, 25, 25)); darkPalette.setColor(QPalette::AlternateBase, QColor(53, 53, 53)); darkPalette.setColor(QPalette::ToolTipBase, Qt::white); darkPalette.setColor(QPalette::ToolTipText, Qt::white); darkPalette.setColor(QPalette::Text, Qt::white); darkPalette.setColor(QPalette::Button, QColor(53, 53, 53)); darkPalette.setColor(QPalette::ButtonText, Qt::white); darkPalette.setColor(QPalette::BrightText, Qt::red); darkPalette.setColor(QPalette::Link, QColor(42, 130, 218)); darkPalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); darkPalette.setColor(QPalette::HighlightedText, Qt::black); QApplication::setPalette(darkPalette); // Set dock options for better behavior setDockOptions(QMainWindow::AllowTabbedDocks | QMainWindow::AllowNestedDocks | QMainWindow::GroupedDragging | QMainWindow::AnimatedDocks); // Create dockable panels createDockWidget("Dock Panel 1", Qt::LeftDockWidgetArea); createDockWidget("Dock Panel 2", Qt::RightDockWidgetArea); createDockWidget("Dock Panel 3", Qt::TopDockWidgetArea); createDockWidget("Dock Panel 4", Qt::BottomDockWidgetArea); // Set window size and title resize(1600, 1200); setWindowTitle("Dockable Panels Example"); } void MainWindow::createDockWidget(const QString &title, Qt::DockWidgetArea area) { // Create the dockable panel QDockWidget *dockWidget = new QDockWidget(title, this); dockWidget->setObjectName(title); dockWidget->setAllowedAreas(Qt::AllDockWidgetAreas); dockWidget->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable); QTextEdit *textEdit = new QTextEdit(dockWidget); textEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); dockWidget->setWidget(textEdit); // Add the dock widget to the main window addDockWidget(area, dockWidget); // Set minimum sizes to prevent complete collapse dockWidget->setMinimumWidth(100); dockWidget->setMinimumHeight(100); // Ensure docks are not floating initially dockWidget->setFloating(false); // Show the dock widget dockWidget->show(); }
-
Well, you have definitively found a bug, thanks!
Setting a style or a palette isn't necessary to reproduce it.
The issue reproduces on openSuSE Tumbleweed with Qt 6.10 just like that:#include <QApplication> #include <QMainWindow> #include <QDockWidget> #include <QStyleFactory> #include <QTextEdit> struct MainWindow : public QMainWindow { MainWindow(QWidget *parent = nullptr); void createDockWidget(const QString &title, Qt::DockWidgetArea area); }; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // Set dock options for better behavior setDockOptions(QMainWindow::AllowTabbedDocks | QMainWindow::AllowNestedDocks | QMainWindow::GroupedDragging | QMainWindow::AnimatedDocks); // Create dockable panels createDockWidget("Dock Panel 1", Qt::LeftDockWidgetArea); createDockWidget("Dock Panel 2", Qt::RightDockWidgetArea); createDockWidget("Dock Panel 3", Qt::TopDockWidgetArea); createDockWidget("Dock Panel 4", Qt::BottomDockWidgetArea); // Set window size and title resize(1600, 1200); setWindowTitle("Dockable Panels Example"); } void MainWindow::createDockWidget(const QString &title, Qt::DockWidgetArea area) { // Create the dockable panel QDockWidget *dockWidget = new QDockWidget(title, this); dockWidget->setObjectName(title); dockWidget->setAllowedAreas(Qt::AllDockWidgetAreas); dockWidget->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable); QTextEdit *textEdit = new QTextEdit(dockWidget); textEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); dockWidget->setWidget(textEdit); // Add the dock widget to the main window addDockWidget(area, dockWidget); // Set minimum sizes to prevent complete collapse dockWidget->setMinimumWidth(100); dockWidget->setMinimumHeight(100); // Ensure docks are not floating initially dockWidget->setFloating(false); // Show the dock widget dockWidget->show(); } int main(int argc, char* argv[]) { QApplication app(argc, argv); MainWindow mainWindow; mainWindow.show(); return app.exec(); };
Feel free to submit a bug report at https://bugreports.qt.io, use the above as a reproducer and assign the ticket to me.
My guess is, that the minimum width/height don't get applied initially when the dock widgets are still docked.
Undocking and docking causes them to be applied. -
This one has bugged me really really badly!
I closed the bugreport as invalid.
In a nutshell: What the reproducer misses (and I have overlooked it as well), is setting a central widget to the main window, as documented here.
A main window should have that, if it should contain anything properly laid out.
It doesn't complain, when dock widgets are added without a central widget.
The advantage of the central widget is, that it separates dock areas from each other. Without one, they completely overlap.
It's possible to undock and re-dock the dock widgets. However, they won't end up at their original dock area.
They usually formed a cluster in the right dock area, which almost looks like their initial setting.
But with the top and bottom dock areas being empty, there is no size constraint and therefore no collapsing.