gpt4 book ai didi

qt - 关于 QSettings、qmlRegisterType() 和 setContextProperty 的一些查询

转载 作者:行者123 更新时间:2023-12-04 19:54:00 26 4
gpt4 key购买 nike

我将尝试通过我目前正在开发的应用程序来解释我的困惑。

我的应用程序(基于 Qt5.1 + Qt Quick Controls)与 Facebook API 交互以管理 Facebook 页面。我试图将 QML 代码(用于 UI)与 C++ 核心尽可能分开。

现在,需要 OAuth2 实现才能与 Facebook API 交互。为此,我有一个 C++ OAuth2 类,其构造函数具有以下签名:

OAuth2::OAuth2(QString appId, QString redirectUrl, QStringList permissions);

现在由于OAuth流程需要浏览器,我也实现了一个OAuthBrowser.qml,使用OAuth2来完成授权。

我有以下选项可以将 OAuth2 类公开给 OAuth2Browser:

  1. 实例化 OAuth2 并使用 setContextProperty() 将实例公开给 OAuth2Browser。但是,这意味着我的 C++ 代码必须处理 UI 代码。更令人费解的问题是 OAuth2Browser 是一个辅助窗口。当用户点击 MainWindow 上的“Authorize”窗口时,
    AppController C++ 对象(连接到 MainWindow)将启动 OAuth2Browser 窗口。因此,OAuth2Browser 的实例化代码将深入到 AppController 方法中。如果只有 main.cpp 必须处理窗口创建就好了。
  2. 使用 qmlRegisterType()。在这种情况下,我无法将参数传递给构造函数。因此,我将不得不实现一个初始化 OAuth2 对象的 init() 方法。然后,我将在 OAuth2Browser 的 Component.onCompleted() 方法中调用此 init() 方法。但是,在这种方法中,我必须将 QSettings 公开给 UI 代码 - QML 窗口,以便 init() 方法所需的参数可以被检索。我非常怀疑将应用程序设置直接公开给 QML UI 是否是个好主意。
  3. 在 OAuth2 构造函数中隐式使用 QSettings。这样,我就不必传递任何参数,并且可以使用 qmlRegisterType()。然而,这意味着我正在“幕后”做一些神奇的事情。我没有显式传递 QSettings 实例,而是在任何我想用的地方使用它,从而对公共(public) API 隐藏了初始化细节。

IRC 上建议基于第三个选项的替代方案 - 如果没有参数传递给构造函数,则使用 initFromSettings() 类型的方法来初始化实例。这样,初始化就不会被隐藏,并且 initFromSettings() 可以自信地在其内部使用 QSettings。现在,我可以愉快地使用 qmlRegisterType() 在 QML 中实例化 OAuth2。

那么,更好的方法是什么?

此外,

  1. 将 QSettings 直接暴露给 QML UI 是个好主意吗?
  2. 我个人更喜欢 qmlRegisterType() 而不是 setContextProperty() - 这样,注册类的实例的生命周期完全由 QML 维护。但是,由于缺乏参数化构造函数的支持,前者不太可能被使用,除非使用某种形式的 init()
    明确地进行初始化。这是一个好的设计吗?

我提前为一篇极其冗长的帖子道歉。但我认为最好在这里问。

最佳答案

很难完全理解您的帖子,因为它太长且信息密集。以下是我对它们的值(value)的建议。

您想知道什么是好的设计,但没有指定您的目标。除非您可以列举目标,否则您无法真正评价某个事物实现目标的程度。

您正在处理 facebook 的 api。我的 Crystal 球说改变是你需要处理的事情。因此,将所有工具放入 qml 中可能会使您能够更好地响应变化。您可以通过在 qml 文件中重写 javascript 而不是重新编译(希望如此)来响应更改。使用属性和信号/插槽设计,它应该足够灵活以完成工作。性能似乎不是问题。

我会创建一个设置对象来公开您要存储的内容。也许使用 Qt 已经提供的模型/ View 架构。底层存储、xml 文件、数据库、QSettings 注册表并不重要。您可以提供一个网格/列表,以允许用户在必要时更新他们的设置。

将 oauth 和浏览器工具放在一起作为对象,让您可以在 qml 中编写应用程序的行为脚本。

这些用于公开 C++ 对象的工具也可能非常适合与社区分享。

祝你好运!

关于qt - 关于 QSettings、qmlRegisterType() 和 setContextProperty 的一些查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18152290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com