我有一个QQuickWidget。我想根据其QML内容使其自动调整,并在内容无法适合窗口的情况下提供水平和垂直滚动条。
我将QQuickWidget放在QScrollArea中,并将布局添加到QScrollArea以使QQuickWidget填充它。在父窗口构造函数中,我添加了一行:
scroll_area->setWidget(quick_widget);
但是,没有可用的滚动条,独立于QML内容大小。如何配置QQuickWidget和QScrollArea以满足我的需要?
UPDATE1:嗯,我正试图通过QDesigner来做到这一点。实际的UI 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内容不适合它的大小。
UPDATE2:可能存在动态添加项目的问题。也许应该手动修改根对象的高度和宽度(或者它们不应该?)例如:
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;
答案 0 :(得分: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()
}
}
答案 1 :(得分:0)
您必须将widgetResizable
的{{1}}属性设置为QScrollArea
(默认为false
)。
您可能还想分别将水平和垂直对齐方式设置为true
和AlignLeft
。