如何通过拖动调整大小手柄来折叠QDockWidget?

时间:2015-05-21 17:42:29

标签: c++ qt resize qt4 qdockwidget

基本问题

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

结束目标

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

我得到了什么

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

替代解决方案?

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

2 个答案:

答案 0 :(得分:0)

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

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

调整大小到不存在似乎有点反直觉,或者更确切地说,通常不会在野外发现。 (IMHO)

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

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

希望有所帮助。

答案 1 :(得分:0)

我的第一个答案没问题,但它更像是一个黑客而不是典型的设置。

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

基本上使用设置了最小尺寸的项目创建一个或多个QSplitter,例如QLabelQTextEdit等。然后尝试调整{{1}的大小超过最小尺寸。经过一段时间后,它会崩溃。

QSplitter的此功能直到最近才为我所知。

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

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

希望有所帮助。