Как разрешить интерактивное изменение размера плавающего виджета дока Qt5 - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть следующий код Qt5.11.0 для создания qdockwidget.Природа виджета такова, что имеет смысл позволить пользователю изменять размер виджета в интерактивном режиме с помощью мыши по желанию, когда плавающий виджет (пример ниже придуман, но я считаю, иллюстрирует проблему).

Когда я запускаю это и перемещаю dockwidget в свое собственное окно верхнего уровня, оказывается, что очень трудно (Linux) или невозможно (OSX) изменить размер dockwidget через взаимодействие с пользователем.В RHEL Linux 7.6 при наведении курсора мыши на правый нижний угол плавающего виджета создается курсор «изменения размера», однако горячая точка такого поведения в лучшем случае имеет ширину в один или два пикселя, что делает его очень трудным и разочаровывающим для пользователей.изменить размер плавающих док-виджетов.На 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 () и искал по всей сети, но пока безрезультатно.

Как мне управлять размером горячей зоны для изменяемого размера плавающего виджета, управляемого мышью, с помощью Qt в Linux, и как мне включить его в первую очередь с Qt в OSX?

1 Ответ

0 голосов
/ 06 декабря 2018

К сожалению, граница отдельного 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();
}

Здесь вы можете найти описание всех доступных оконных флагов, чтобы настроить внешний видваш виджет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...