Использование QScrollArea с QQuickWidget

У меня есть QQuickWidget. Я хотел бы сделать его автоматически изменяемым в соответствии с его содержимым QML и предоставлять как горизонтальные, так и вертикальные полосы прокрутки в случае, когда его содержимое не может уместиться в окне.

Я поместил QQuickWidget в QScrollArea и добавил макет в QScrollArea, чтобы QQuickWidget заполнил его. В конструкторе родительского окна я добавил строку:

scroll_area->setWidget(quick_widget);

Однако полосы прокрутки не доступны, независимо от размера содержимого QML. Как настроить QQuickWidget и QScrollArea, чтобы они работали так, как мне нужно?

ОБНОВЛЕНИЕ 1: Ну, я пытаюсь сделать это через QDesigner. Фактический пользовательский интерфейс XML:

<widget class="QScrollArea" name="scroll_area">
 <property name="sizePolicy">
  <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
   <horstretch>0</horstretch>
   <verstretch>0</verstretch>
  </sizepolicy>
 </property>
 <property name="widgetResizable">
  <bool>true</bool>
 </property>
 <widget class="QQuickWidget" name="quick_widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>502</width>
    <height>269</height>
   </rect>
  </property>
  <property name="sizePolicy">
   <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
    <horstretch>0</horstretch>
    <verstretch>0</verstretch>
   </sizepolicy>
  </property>
  <property name="resizeMode">
   <enum>QQuickWidget::SizeViewToRootObject</enum>
  </property>
  <property name="source">
   <url>
    <string>…</string>
   </url>
  </property>
 </widget>
</widget>

И во время отладки я вижу, что QScrollArea.widget() уже был установлен в quick_widget (без принудительного вызова scroll_area.setWidget()), но все еще нет доступных полос прокрутки, даже если содержимое quick_widget не может соответствовать его размеру.

ОБНОВЛЕНИЕ 2: Ну, возможно, проблема в том, что элементы добавляются динамически. И, возможно, высота и ширина корневого объекта должны быть изменены вручную (или не должны?) Например:

if ( object.x + object.width > root.width )
    root.width = object.x + object.width;
if ( object.y + object.height > root.height )
    root.height = object.y + object.height;

1 ответ

Я пробовал следующий код, и он отлично работает.

//mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    auto scrollArea = new QScrollArea();
    setCentralWidget(scrollArea);

    auto quickWidget = new QQuickWidget();
    quickWidget->setSource(QUrl("qrc:/main.qml"));
    quickWidget->setResizeMode(QQuickWidget::SizeViewToRootObject);
    scrollArea->setWidget(quickWidget);
}
//main.qml
//a varying Rectangle
import QtQuick 2.0

Rectangle {
    id: root ;color: "red"; width: 400; height: 500
    Timer{
        id: timer
        property real time
        interval: 400
        repeat: true
        onTriggered: {
            root.width = 800 + Math.sin(time*100) *100
            time = time + 1;
            console.log(time)
        }
    }

    Component.onCompleted: {
        timer.time = 0
        timer.start()
    }
}

Когда корневой треугольник маленький

Когда корневой треугольник большой

Вы должны установить widgetResizable собственность QScrollArea к false (по умолчанию true).

Вы также можете установить горизонтальное и вертикальное выравнивание наAlignLeft а также AlignTop соответственно.

См. Документацию для widgetResizable свойство

Другие вопросы по тегам