【问题标题】:Using QML with a qt widgets type of ui form?将 QML 与 qt 小部件类型的 ui 表单一起使用?
【发布时间】:2019-03-02 00:33:52
【问题描述】:

所以我想创建一个看起来像这样的应用程序:

这个应用程序的作用是,我可以通过左侧的组合框选择形状并将它们放在右侧的区域中。使用滑块,我可以改变尺寸。复选框选择边框或使形状具有填充颜色。

我的问题是我想通过使用 QML 创建这些形状,因为它相对容易创建具有矩形、圆形等的基本形状,但是我也希望在左侧看到漂亮的界面。这是否可能仅使用 QML 或者我需要将 QML 集成到 qtwidgets 或类似的东西中?我知道 QML 中还存在一个滑块和一个按钮,看起来非常好,但我希望在右侧有一个清晰的区域,向用户指示他可以在哪里创建形状和左侧的 ui 内容。这里的正确方法是什么?

【问题讨论】:

  • 我不明白问题的标题和你想要达到的目标之间的联系。你可以在 QML 中做所有事情(然后完全不用 QtDesigner ui)。或者您可以在窗口的给定 QWidget 中嵌入一些 QtQuick,例如使用您可以在 QtDesigner 中拖放的QQuickWidget

标签: qt qml


【解决方案1】:

对于应用程序的绘图部分,使用 QGraphicsScene https://doc.qt.io/qt-5/qgraphicsscene.html 也可以替代使用 Qt Widget 而不是将其与 QML 混合使用。

但如果您想坚持使用 QML,您可以查看 QQuickView https://doc.qt.io/qt-5/qquickview.html,这是一个集成的小示例:

#include <QQuickView>
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // ..

    QQuickView *view = new QQuickView;
    QWidget *container = QWidget::createWindowContainer(view, this);

    // some set up if needed
    container->setMinimumSize(1280, 600);
    container->setMaximumSize(1280, 600);
    container->setFocusPolicy(Qt::TabFocus);

    // ..

    view->setSource(QUrl("main.qml"));
    view->setResizeMode(QQuickView::SizeViewToRootObject);

    ui->verticalLayout->addWidget(container);

    // ..

}

【讨论】:

  • 谢谢,我在网上找到了很多次这种方法,并且还能够获得一些使用这种方法的示例项目,但是我不能让它工作,以及如何解释这样做对我来说并不容易理解,因为我对 Qt 还是比较陌生。但目前我会坚持在 QML 中做所有事情,也许将来会再试一次。
  • 此外,这种方法并不总是有效:例如在嵌入式 Linux 上,当使用 EGLFS 作为 QPA 后端时,您不能混合基于 OpenGL 的窗口和 Qt Widget 窗口,但如果您依赖 X11,那么通常很好。
【解决方案2】:

我强烈建议对整个 UI 使用 QML。首先,Qt Quick 和 QWidgets 是完全不同的 UI 引擎。我发现基于标记的 UI 更易于源代码控制、调整和通常使用。此外,Qt Quick 和 QML 是我用过的最好的 UI 框架,而且有很多。你可以轻松地做你想做的一切。

【讨论】:

    猜你喜欢
    • 2020-05-06
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多