2015-02-28 3 views
0

Я пытаюсь использовать виджеты док-станции в классе основного окна в Qt5. Однако, когда я установил центральный виджет, чтобы иметь фиксированную высоту Qt имеет проблемы со стыковкой окон сверху или снизу. В принципе, похоже, что над и под центральным виджетами есть некоторые «отступы» или «поля». Если я устанавливаю автоматическую высоту в виджетах, док-станция прекрасно работает в любом направлении от края до края (сверху/снизу). Как я могу либо удалить поля, либо включить функцию стыковки при использовании центрального виджета с фиксированной высотой?Qt5 QDockWidget с фиксированной высотой CentralWidget

См. Скриншоты, например.

Dock Right w/ Auto Height (No Margins on Central Widget)

Dock Right ж/Авто Высота (без полей на Центральном Widget)

Dock Bottom w/ Auto Height (No Margins on Central Widget)

Dock Дно ж/Авто Высота (без полей на Центральном Widget)

Dock Bottom w/ Fixed Height (Margins/Padding, won't dock)

Dock Дна ж/Fixed Height (Поля/Перетяжка - серые области, не будет состыковать)

Вот код, если это помогает.

Заголовок: определение

class MainWindow : public QMainWindow { 
    Q_OBJECT 

public: 
    MainWindow(QString); 
    ~MainWindow(); 

private: 
    void createDockWindows(); 
    QListWidget *m_dock_list; 
    QString m_directory; 
    QWidget *m_mainWidget; 
}; 

Класс:

MainWindow::MainWindow(QString program) 
    : m_directory(".") 
{ 
    m_mainWidget = new QWidget; 
    m_mainWidget->setFixedHeight(156); 
    m_mainWidget->setStyleSheet("background-color: blue;"); 

    createDockWindows(); 

    // set central widget and default size 
    setCentralWidget(m_mainWidget); 
} 

// dock functions 
void MainWindow::createDockWindows() 
{ 
    QDockWidget *dock = new QDockWidget(tr("Dock List"), this); 
    dock->setAllowedAreas(Qt::LeftDockWidgetArea | 
          Qt::RightDockWidgetArea | 
          Qt::BottomDockWidgetArea); 
    m_dock_list = new QListWidget(dock); 
    m_dock_list->addItems(QStringList() 
     << "item 1" 
     << "item 2" 
     << "item 3" 
     << "item 4"); 
    dock->setWidget(m_dock_list); 
    addDockWidget(Qt::RightDockWidgetArea, dock); 
} 

ответ

0

В случае, если кто-то пытается выяснить это поведение, вот что я нашел. Верхний и нижний поля - это просто Qt, пытающийся поместить виджет фиксированного размера в пространство, большее, чем виджет (очевидно). Однако ограниченная способность к стыковке возникает из-за того, что виджет стыковки имеет минимальный вертикальный размер . Таким образом, когда window height < central widget height + min(docking widget height) Qt не разрешает функцию док-станции. После достижения высоты порогового окна (путем изменения размера пользователя) Qt позволяет использовать функцию док-станции.

Я бы предпочел, чтобы функция стыковки происходила независимо от высоты окна с автоматическим изменением размера окна для размещения окна стыковки.

Решение с использованием signals

, возможно, немного Hacky, и может быть трудно поддерживать, если у вас есть сложный макет. Но для моего случая использования это можно сделать.

  1. Не устанавливайте размер в центре виджета, чтобы он автоматически заполнил главное окно.
  2. Когда док изменит местоположение, он испускает dockLocationChanged. Мы можем автоматизировать размер главного окна, если прикрепляемое окно перемещается в целевое местоположение. Для моего случая это дно.

Код:

void MainWindow::createDockWindows() 
{ 
    ... 
    QObject::connect(dock, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), 
        this, SLOT(s_dock_window_resize(Qt::DockWidgetArea))); 
} 

// Autosize window slot on dock location change. 
void MainWindow::s_dock_window_resize(Qt::DockWidgetArea area) 
{ 
    if (area == Qt::DockWidgetArea::BottomDockWidgetArea) { 
     // m_mainWidget_min_height is the height we would have enforced 
     // on the widget. Now we set it somewhere else and check it here. 
     int min_height = m_dock_list->height() + m_mainWidget_min_height; 
     if (min_height > MainWindow::height()) { 
      MainWindow::resize(MainWindow::width(), min_height); 
     } 
    } 
}