带固定高度CentralWidget的Qt5 QDockWidget

时间:2015-02-28 01:01:19

标签: c++ qt qdockwidget

我试图在Qt5的主窗口类中使用停靠小部件。但是,当我将中央窗口小部件设置为固定高度时,Qt无法将窗口对接到顶部或底部。基本上,看起来有一些" padding"或"保证金"在中央小部件的上方和下方。如果我在窗口小部件上设置了自动高度,则对接可以在边对边(顶部/底部)的整个过程中正常工作。如何在使用固定高度的中央窗口小部件时删除边距或启用对接功能?

例如,请参见屏幕截图。

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

码头右侧有自动高度(中央小工具没有边距)

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

底座底部带自动高度(中央部件无边距)

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

码头底部带有固定高度(边距/填充 - 灰色区域,赢得了停靠)

如果有帮助,这是代码。

标题

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);
}

1 个答案:

答案 0 :(得分:0)

如果有其他人试图找出这种行为,这就是我发现的。顶部和底部边距只是Qt试图将固定大小的小部件放入比小部件更大的空间(明显的)。但是,受限制的对接能力来自具有最小垂直尺寸的对接小部件。因此,当window height < central widget height + min(docking widget height) Qt不允许停靠功能时。一旦达到阈值窗口高度(通过用户调整大小),Qt就允许停靠功能。

我更喜欢无论窗口高度如何都发生对接功能,并且自动窗口调整大小以容纳对接窗口。

使用signals

的解决方案

可能有点 hacky ,如果您的布局复杂,可能很难维护。但对于我的用例,这是可行的。

  1. 不要在中心窗口小部件上强制执行大小,让它自动填充主窗口。
  2. 当停靠点更改位置时,它会发出dockLocationChanged。如果可停靠窗口移动到目标位置,我们可以自动调整主窗口的大小。对于我的情况,这是底部。
  3. 代码:

    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);
            }
        }
    }