Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Dock panels glitching out
Forum Updated to NodeBB v4.3 + New Features

Dock panels glitching out

Scheduled Pinned Locked Moved Unsolved General and Desktop
3 Posts 2 Posters 191 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • I Offline
    I Offline
    imisumi
    wrote on last edited by
    #1

    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!

    example of the buggy behavior

    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();
    }
    
    1 Reply Last reply
    1
    • Axel SpoerlA Offline
      Axel SpoerlA Offline
      Axel Spoerl
      Moderators
      wrote on last edited by Axel Spoerl
      #2

      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.

      Software Engineer
      The Qt Company, Oslo

      1 Reply Last reply
      2
      • Axel SpoerlA Offline
        Axel SpoerlA Offline
        Axel Spoerl
        Moderators
        wrote on last edited by Axel Spoerl
        #3

        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.

        Software Engineer
        The Qt Company, Oslo

        1 Reply Last reply
        2

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved