将QScrollArea与QQuickWidget一起使用

时间:2016-03-07 15:22:51

标签: qt resize qscrollarea qquickwidget

我有一个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;

2 个答案:

答案 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()
    }
}

When the root retangle is small

When the root retangle is big

答案 1 :(得分:0)

您必须将widgetResizable的{​​{1}}属性设置为QScrollArea(默认为false)。

您可能还想分别将水平和垂直对齐方式设置为trueAlignLeft

See the docs for widgetResizable property