如何允许交互式调整浮动Qt5停靠小部件的大小

时间:2018-12-05 23:47:12

标签: qt qt5

我具有以下Qt5.11.0代码来创建qdockwidget。小部件的性质使得有意义的是,当ockockwidget浮动时,允许用户根据需要通过鼠标以交互式方式调整小部件的大小(以下示例是人为设计的,但我相信可以说明问题)。

当我运行此程序并将Dockwidget浮动到其自己的顶级窗口中时,事实证明,通过用户交互来调整Dockwidget的大小非常困难(Linux)或不可能(OSX)。在RHEL Linux 7.6上,将鼠标悬停在浮动Dockwidget的右下角会产生一个“调整大小”光标,但是,这种行为的热点最多只有一两个像素宽,这使用户非常困难并且令人沮丧。调整浮动的dockwidgets的大小。在OSX 10.13.6上,我完全看不到通过鼠标交互来调整Dockwidget大小的任何选项。

这是示例代码:

#include <QApplication>
#include <QMainWindow>
#include <QDockWidget>
#include <QTextEdit>
#include <QTextStream>
#include <QFile>
#include <QSizeGrip>

int
main( int argc, char *argv[] ) {
    QApplication app( argc, argv );

    QMainWindow* mw = new QMainWindow();
    mw->setCentralWidget( new QWidget() );

    QDockWidget* dockWidget = new QDockWidget( "Code viewer", mw );
    mw->addDockWidget( Qt::LeftDockWidgetArea, dockWidget );

    QTextEdit* textEdit = new QTextEdit( dockWidget );
    dockWidget->setWidget( textEdit );

    QFile file( "/etc/protocols" );
    QString filler;
    if( ! file.open( QIODevice::ReadOnly ) ) {
            exit( -1 );
    } else {
            QTextStream in( &file );
            while( ! in.atEnd() ) {
                    filler += in.readLine();
            }
            file.close();
    }
    textEdit->setText( filler );

    mw->show();

    return app.exec();
}

我已经尝试了QSizeGrip()并在整个网络上进行搜索,但到目前为止没有任何效果。

如何在Linux上使用Qt控制鼠标驱动的浮动ockockdget调整大小的热区大小,以及如何在OSX上使用Qt首先启用这种功能?

1 个答案:

答案 0 :(得分:2)

不幸的是,分离的QDockWidget的边框是由窗口装饰器处理的,因此您不能通过样式表或调整大小手柄来更改它。 无论如何,您可以更改停靠小部件的窗口标志,以强制窗口装饰器绘制常规边框。

以下是您在示例中的操作方法:

#include <QApplication>
#include <QMainWindow>
#include <QDockWidget>
#include <QTextEdit>
#include <QTextStream>
#include <QFile>
#include <QSizeGrip>

int main( int argc, char *argv[] ) {
    QApplication app( argc, argv );

    QMainWindow* mw = new QMainWindow();
    mw->setCentralWidget( new QWidget() );

    QDockWidget* dockWidget = new QDockWidget( "Code viewer", mw );
    mw->addDockWidget( Qt::LeftDockWidgetArea, dockWidget );

    // handle floating changes
    QObject::connect(dockWidget, &QDockWidget::topLevelChanged, [dockWidget] (bool floating)
    {
        if (floating)
        {
            dockWidget->setWindowFlags(Qt::Window);
            dockWidget->show();
        }
    });

    QTextEdit* textEdit = new QTextEdit( dockWidget );
    dockWidget->setWidget( textEdit );

    QFile file( "/etc/protocols" );
    QString filler;
    if( ! file.open( QIODevice::ReadOnly ) ) {
            exit( -1 );
    } else {
            QTextStream in( &file );
            while( ! in.atEnd() ) {
                    filler += in.readLine();
            }
            file.close();
    }
    textEdit->setText( filler );

    mw->show();

    return app.exec();
}

Here,您可以找到所有可用窗口标记的描述,以自定义窗口小部件的外观。