【问题标题】:How can I collapse QDockWidget by dragging the resize handle?如何通过拖动调整大小手柄来折叠 QDockWidget?
【发布时间】:2015-05-21 17:42:29
【问题描述】:

基本问题

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

最终目标

我试图提供一种将 QDockWidget 折叠到 0 宽度或高度的方法,方法是将其调整大小栏拖动到其最小尺寸到 0。由于我需要拖动到最小尺寸,我不能只听小部件的调整大小事件,因为一旦达到最小调整大小值,该事件就会停止。

我有什么

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

替代解决方案?

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

【问题讨论】:

    标签: c++ qt resize qt4 qdockwidget


    【解决方案1】:

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

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

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


    更新: 工作示例代码显示了一种完全按照要求执行的方法...

    https://github.com/peteristhegreat/DocksDemo

    以下是相关代码sn-ps:

    启用调整大小以隐藏

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

    希望对您有所帮助。

    【讨论】:

    • 感谢您的想法,不幸的是,我被要求通过拖动来调整大小。对于优先级,您可以查看它在 perforce 客户端 p4v 中的工作原理,我相信它是用 qt 编写的,但我认为他们使用实际的 qsplitter 方法进行布局而不是 qdock 小部件。
    【解决方案2】:

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

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

    基本上创建一个或多个QSplitters,其中的项目具有设定的最小尺寸,例如QLabelQTextEdit 等。然后尝试将QSplitter 的尺寸调整到超过最小尺寸。很快它就会为你崩溃。

    直到最近我才知道QSplitter 的这个功能。

    如果您正在使用表单,并且想在其中添加 QSplitter,则需要选择多个布局或小部件,然后单击相应的按钮以插入拆分器。

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

    希望对您有所帮助。

    【讨论】:

    • 是的,如果您对使用的对象有发言权,那么 QSplitters 绝对是最佳选择。我不知道为什么,但是当您使用 QDockWidgets 时,Qt 系统提供了自己的内部拆分器功能,遗憾的是它没有使用 QSplitter。
    猜你喜欢
    • 2010-10-14
    • 2017-08-30
    • 2014-07-15
    • 1970-01-01
    • 2012-01-17
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多