【问题标题】:embedding qquickwindow inside qwidget在 qwidget 中嵌入 qquickwindow
【发布时间】:2017-05-20 12:45:11
【问题描述】:

如何将 qquickwindow 嵌入到 qwidget 中? 我的代码是这样的:

主窗口.cpp

#include "mainwindow.h"
#include <QQmlApplicationEngine>
#include <QQuickWindow>
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
engine = new QQmlApplicationEngine(":/drawer.qml", this);
auto wins = engine->rootObjects();
if (wins.size() > 1) {
QQuickWindow *win=0;
win=wins.at (0)->findChild<QQuickWindow*>("win1");
if (win) {
  win->setFlags (Qt::FramelessWindowHint);
  this->setMinimumSize (win->size ());
  this->resize (win->size ());      

 ui->gridLayout_qml->addWidget(QWidget::createWindowContainer(QWindow::fromWinId (win->winId ()),this));
   }
  }
 }

 MainWindow::~MainWindow() {
  delete engine;
  delete ui;
 }

drawer.qml

 import QtQuick 2.6
 import QtQuick.Layouts 1.0
 import Qt.labs.controls 1.0

 ApplicationWindow {
  objectName: qsTr("win1")
  visible: true
 width: 640
 height: 480
  title: qsTr("Hello World")

  SwipeView {
    id: swipeView
    anchors.fill: parent
    currentIndex: tabBar.currentIndex

    Page {
        Label {
            text: qsTr("FIRST page")
            anchors.centerIn: parent
        }
    }

    Page {
        Label {
            text: qsTr("Second page")
            anchors.centerIn: parent
        }
    }
  }

  footer: TabBar {
    id: tabBar
    currentIndex: swipeView.currentIndex
    TabButton {
        text: qsTr("First")
    }
    TabButton {
        text: qsTr("Second")
     }
    }
 }

以上代码是创建新的单独窗口而不是将其嵌入到 gridLayout_qml 中。如何将此 qquickwindow 插入到 gridLayout_qml,任何指针? 谢谢 Qt 5.6.2 windows 7 msvc2015.

【问题讨论】:

    标签: qt qml qt5.6 qquickwidget


    【解决方案1】:

    ApplicationWindow 是一个顶级窗口。将其更改为不是窗口的内容,例如 Page。

    【讨论】:

    • 感谢您的快速回答。我已将 ApplicationWindow 更改为 Page 并没有显示任何内容。还有什么要改变的吗?显然,这条线无法转换 win=wins.at (0)-&gt;findChild&lt;QQuickWindow*&gt;("win1"); ,因此不会调用 ui-&gt;gridlayout_qml-&gt;addwidget。 qml 页面应该是从什么派生的?
    • 好的,我已经使用 qquickwidget 而不是 qquickwindow 而不是手动使用 qwidget::createwindowcontainer 解决了这个问题。谢谢
    • 嗯,我的错。我没有仔细阅读代码。我以某种方式期望“标准”窗口容器过程使用 QQuickView 加载 QML 内容,它本身就是一个窗口,然后将其嵌入到窗口容器中。我现在意识到您实际上是在使用 QQmlApplicationEngine 加载 QML,所以实际上只有一个窗口。我怀疑实际的问题是使用 if QWindow::fromWinId() 而不是直接传递应用程序窗口。但是,无论如何,您可能会更好地使用 QQuickWidget,因为它应该是窗口容器的更好替代品。
    • 是的,使用简单的 QQuickWidget::setSource 更好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    相关资源
    最近更新 更多