Qml / Qt / C ++: QQuickView в виджете не может правильно определить позицию

Я реализую простую программу с QT5.5, которая содержит окно HTML (QWebview), как на следующем снимке экрана:

окно HTML с правой стороны

Теперь я хочу, чтобы программа была установлена ​​и для iOS, например. для iPad. Я обнаружил, что класс QWebview недоступен для мобильной системы, поэтому мне пришлось изменить окно HTML на QQuickView с файлами QML (или есть способ лучше?). Я нашел в сети следующий код:

QQuickView *view = new QQuickView();
QWidget *container = QWidget::createWindowContainer(view, this);
container->setMinimumSize(200,400);
container->setMaximumSize(200,400);
container->setFocusPolicy(Qt::TabFocus);
view->setSource(QUrl("qrc:///webview.qml"));
layout->addWidget(container);

Затем я добавил контейнер в mainWindow. Файл webview.qml:

import QtQuick 2.5
import QtWebView 1.0
Rectangle {
id: rectangle
width: 200
height: 400
WebView {
    id: webview
    url: "file:///test.html"
    anchors.fill: parent
    width: 200
    height: 400
}
}

Но как-то не получается разобрать верстку. HTML-окно в iOS За контейнером находится пустой / белый прямоугольник, а контейнер также не в окне HTML с правой стороны, где он должен быть. Когда я изменяю ширину и высоту прямоугольника в файле qml, изменяется только размер веб-просмотра, а не белый фон.

Кто-нибудь может сказать мне, как я могу это исправить? Я также использовал container->setParent(), но вид всегда слева.


person Jian    schedule 23.12.2015    source источник


Ответы (1)


Видимости авторского кода может быть недостаточно, но в целом легче установить виджет в макете с определенным выравниванием. Таким образом, вы указываете виджету быть на определенной стороне и делаете размещение не зависимым от координат / размера виджета и т. Д. Предполагается, что переменная layout представляет собой горизонтальную компоновку окна или QHBoxLayout.

// make sure that QHBoxLayout* layout = new QHBoxLayout(this);
// or set the horizontal layout somehow else
QQuickView *view = new QQuickView();
QWidget *container = QWidget::createWindowContainer(view, this);

container->serFixedWidth(200); // the layout is horizontal
                               // and we *may* want to fix the width

container->setFocusPolicy(Qt::TabFocus);
view->setSource(QUrl("qrc:///webview.qml"));
layout->addWidget(container, Qt::AlignRight); // align to the right

Помните, что остальная часть горизонтального макета должна быть заполнена таким же образом с соблюдением относительного положения в нем.

person Alexander V    schedule 23.12.2015
comment
Извините за поздний отзыв, потому что сейчас Рождество и Новый год :). layout в моем коде было QVBoxLayout, но я тестировал как QHBoxLayout, так и QVBoxLayout и Qt::AlignRight, но он вообще не изменился. Это странно, потому что окно html на самом деле находится там, где должно быть, а его содержимое - нет. Похоже, что у контейнера нет правильного родителя, но когда я вывожу container->parent(), все правильно. Вы знаете, где я могу делать не так? - person Jian; 31.12.2015