我如何通过拖动调整大小句柄来折叠QDockWidget

How can I collapse QDockWidget by dragging the resize handle?

本文关键字:句柄 折叠 QDockWidget 何通过 拖动 调整      更新时间:2023-10-16

基本问题

是否可以管理分隔QDockWidgets的栏的调整大小/拖动事件?

最终目标

我试图提供一种方法来崩溃QDockWidget到0的宽度或高度通过拖动其调整大小栏过去的最小尺寸为0。因为我需要拖过最小尺寸,所以我不能只听小部件的resize事件,因为它一旦达到最小大小值就会停止。

What I've Got

我有多个QDockWidgets都停靠在一个主窗口。每个QDockWidget都有一个QT提供的调整大小句柄。对我来说,这看起来像一个QSplitter,但是当我在主窗口上执行findChildren<QSplitter *>()时,我得到0个引用。当我内省对象时,似乎可能有一个QResizeHandler,但我找不到关于这个对象的任何文档,我认为它可能是一个私有类。

替代方案?

我愿意接受其他建议,我知道我可以很容易地在标题栏上添加一个折叠按钮,但如果可能的话,我想让它可拖动。也许我可以找到一种方法来禁用最小调整大小值,并允许用户只是调整大小为0?

我的第一个答案还可以,但它更像是一个hack而不是一个典型的设置。

最近在另一个项目中,我发现使用QSplitter可以提供所需的功能。

基本上创建一个或多个具有设置最小大小的项目的QSplitter,例如QLabelQTextEdit等。然后尝试调整QSplitter的大小超过最小大小。过不了多久,它就会为你崩溃。

直到最近我才知道QSplitter的这个特性。

如果你正在使用表单,并且想要在那里添加一个QSplitter,它需要选择多个布局或小部件,然后单击适当的按钮来插入splitter。

http://www.qtcentre.org/threads/14954-QSplitter-in-Designer

希望对你有帮助。

如果您右键单击任何工具栏,它可以让您取消选中/选中工具栏和dock小部件。通常为了隐藏一个dock小部件,我只在dock小部件的标题栏中使用x。

我将添加一个View菜单项,在它下面放置工具栏,并添加一个可检查的菜单项/操作项,连接到dock小部件的显示。

将大小调整为不存在似乎有点违反直觉,或者更确切地说,在野外并不常见。(恕我直言)


更新:

https://github.com/peteristhegreat/DocksDemo

以下是相关的代码片段:

允许隐藏

void CollapsableDockWidget::resizeEvent(QResizeEvent *re)
{
    qDebug() << this->objectName() << this->minimumSize() << this->maximumSize() << this->size();
    QList <QWidget*> children = this->findChildren<QWidget*>();
    foreach(QWidget* w, children)
        w->setMinimumSize(1,1);
    int minWidth = 80 + 1;
    int minHeight = 23 + 1;
    int defaultDimension = 100;
    if(re->size().width() < minWidth)
    {
        this->toggleViewAction()->trigger();
    }
    if(re->size().height() < minHeight)
    {
        this->toggleViewAction()->trigger();
    }
}

添加到视图菜单

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QList <QDockWidget*> dockWidgets = this->findChildren<QDockWidget*>();
    int count = 0;
    QMenu * menu = ui->menuView;
    foreach(QDockWidget* dw, dockWidgets)
    {
        count++;
        QString dockName = "Dock Widget " + QString::number(count);
        QLabel * label = dw->findChild<QLabel*>();
        if(label)
            label->setText(dockName);
        dw->toggleViewAction()->setText(dockName);
        menu->addAction(dw->toggleViewAction());
        qDebug() << dw->objectName();
    }
}

希望对你有帮助。