Использование 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
соответственно.