Qt/QML:将 QImage 从 C++ 发送到 QML 并在 GUI 上显示 QImage

2023-12-26

我创建了一个类Publisher它周期性地发出QImage目的。

然而我很难画出QImage到 QML 元素。看来Image and CanvasQML 组件需要QUrl代替QImage,但我不知道如何转换我的QImage to a QUrl。 Edit4:当我说 QUrl 时,我并不是说我正在尝试将图像转换为 URL。那是无稽之谈。我的意思是我想生成对此图像的引用,该图像不在磁盘上,并且 QML 组件要求的数据类型是 URL。

我做了一些研究发现QQuickImageProvider提供了一个解决方案,但我还没有找到任何文档解释如何转换我的QImage向a发出信号QUrl我可以用它来绘图。任何示例代码或参考文档将不胜感激。

感谢您的帮助!

Edit1:

我在这里看了一下:http://qt-project.org/doc/qt-5.0/qtquick/qquickimageprovider.html http://qt-project.org/doc/qt-5.0/qtquick/qquickimageprovider.html我不明白如何将 QImage 传递给快速图像提供程序并从中创建 QUrl。

编辑2。这是标题。实施应该不重要。

class Publisher
{
    Q_OBJECT

public:
    Publisher(QObject* parent = 0);

    virtual ~Publisher(void);

Q_SIGNALS:

    void newImage(const QImage& newImage);
};

编辑3。这是我的QML代码,但我不知道如何绘制我的QImage,所以这段代码毫无意义。

我的 main.cpp 文件:

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    qmlRegisterType<Publisher>("Components", 1, 0, "Publisher");

    QtQuick2ApplicationViewer viewer;
    viewer.setMainQmlFile(QStringLiteral("qml/QQuickViewExample/main.qml"));
    viewer.showExpanded();

    return app.exec();
}

我的 main.qml 文件:

import QtQuick 2.0
import Components 1.0

Rectangle {
    id : testRect
    width: 360
    height: 360

    Image{
        anchors.fill: parent
        id: myImage

        Publisher {
            id: myPub

            onNewImage: {
                myImage.source = newImage;  #I know this doesnt work, it needs a QUrl and not a QImage
            }
        }
    }
}

换句话说,您有一个类发出携带 QImage 的信号,并且想要使用该图像更新 QML 中的项目?有多种解决方案,其中没有一个涉及“将 QImage 转换为 QUrl”(无论这意味着什么,当然您不需要获得data携带图像数据的 URL...)

使用图像提供商

这意味着您可以使用普通的ImageQML 文件中的项目。

  1. 创建一个QQuickImageProvider子类;给它一个QImage成员(提供者的图像),覆盖requestImage提供该图像(实际的id请求并不重要,见下文),并且接收一个插槽QImage并更新会员。
  2. 连接您的Publisher向您的提供商的插槽发出信号
  3. 通过以下方式将提供程序安装到 QML 引擎中QQmlEngine::addImageProvider (see QQuickView::engine);再次id其实并不重要,只要使用一个合理的
  4. 在 QML 中,只需使用简单的Image具有这样的来源的元素

    Image {
        id: myImage
        source: "image://providerIdPassedToAddImageProvider/foobar"
    }
    

    foobar将被传递给您的提供商,但同样,这并不重要。

  5. 我们已经快到了,我们现在只需要一种方法push图像更新到 QML 世界(否则图像将永远不知道何时更新自身)。看我的回答在这里 https://stackoverflow.com/questions/17728337/qimage-into-qml/17734973#17734973了解如何使用Connectionselement和一点JS。

    请注意,一般情况下您不需要Publisher一个 QML 类型,你只需要创建oneC++ 中的实例并将其暴露给 QML 世界QQmlContext::setContextProperty.

使用自定义 Qt Quick 2 项目

QQuickPaintedItem可能是最方便的工作,因为它提供了paint方法采用QPainter。因此,大计划是

  1. 子类QQuickPaintedItem:子类存储QImage被绘制并有一个设置新 QImage 的槽。还有它的paint实现简单地使用绘制图像QPainter::drawImage.
  2. 通过以下方式将子类公开到 QML 世界qmlRegisterType(以便您可以在 QML 中使用它)
  3. 找出一种方法将携带新图像的信号连接到物品的插槽。

    这可能是棘手的部分。

    要在 C++ 中执行连接,您需要一种方法来确定该项目已创建(并获取指向它的指针);通常人们通过分配objectName属性为某个值,然后使用findChild在根对象上(由QQuickView::rootObject()) 获取指向项目本身的指针。然后你可以使用connect照常。

    Or,可以改为在 QML 中执行连接,就像上面一样,通过Connections暴露于 QML 世界的发布者 C++ 对象上的元素:

    MyItem {
        id: myItem
    }        
    
    Connections {
        target: thePublisherObjectExposedFromC++
        onNewImage: myItem.setImage(image)
    }
    

    这样做的优点是无论您何时创建 MyItem 实例都可以工作;但我不是 100% 确定它会起作用,因为我不确定你能处理QImage输入 QML。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt/QML:将 QImage 从 C++ 发送到 QML 并在 GUI 上显示 QImage 的相关文章

随机推荐

  • 创建一个正常运行的 Response 对象

    出于测试目的 我尝试在 python 中创建一个 Response 对象 但事实证明它比听起来更难 我试过这个 from requests models import Response the response Response the r
  • Ant每次都会重建库项目

    我有一个 Android 项目 其中包含两个 Android 库项目 我正在使用命令ant debug构建该项目大约需要 1 分 20 秒 我算了一下 编译第一个android库项目用了17秒 编译第二个android库项目用了42秒 由于
  • 数据网格显示一个新行,但不显示任何后续行

    我有一个数据网格 其中一列显示组合框 目前 新行显示在现有行下方 正如预期的那样
  • 如何使用 EssentialAction

    我有一个自定义正文解析器 可将请求正文流式传输到 Amazon S3 实例 并且我想在上传文件之前进行验证 在请求的标头中 我可以访问内容大小和用户的身份验证令牌 通过这两件事 我可以验证用户是否有权上传文件 阅读 Play 的文档后 似乎
  • 获取请求客户端的 IP 地址(Soap 消息)

    我构建了一个 ASMX 服务 并在代码中处理来自 ELMAH 的错误日志 我将所有字段添加到数据库中 然后添加更多字段 其中之一是所请求客户端的 IP 地址 但我无法 请阅读 不知道如何 得到 我已经习惯了 string ipAddress
  • Java,不支持的类版本错误。我怎样才能解决这个问题

    我在 eclipse 中做作业 它没有报告任何错误 甚至没有警告 当我尝试从终端编译它时 出现以下错误 它在 eclipse 中运行和编译都很好 我认为这与java版本有关 无论如何要修复它或尝试绕过它 vedran vedran debi
  • 为什么不能在批处理 for 循环中使用问号?

    Preface 在编写单独的代码时 我遇到了 for 循环中问号的问题 如下所示 for循环中没有访问到问号 批处理文件 echo off for x in the quick brown fox do echo x Output the
  • 当邮件程序没有这样定义时,如何调用邮件程序上的类方法?

    在 Rails 中发送邮件时 通常会这样做 UserMailer password reset user deliver 但如果我们向内看UserMailer我们可以看到这个 def password reset user not self
  • 如何在我的 Xcode 项目中查看整个 SCM 历史记录?

    如果我查看项目信息中的 SCM 选项卡 我只会看到影响项目文件的提交 我在哪里可以获得整个项目的所有提交的列表 Xcode 4 转到 Organizer 右上角 Repositories 选择存储库 就在那里
  • 如何使用 Flink SQL 按事件时间对流进行排序

    我有一个故障DataStream
  • 如何在 angular-cli 项目中使用全局 scss 文件

    我是 Angular 4 和 Angular CLI 的新手 我找不到任何解决方案如何在整个应用程序中使用 root scss css 文件 因此 我的问题是 如何在项目中使用全局scss文件 创建一个styles文件夹中的src文件夹 然
  • 移动设备的 X/Y 触摸坐标

    我正在创建一个网络应用程序 我希望它可以在移动设备上使用 该应用程序的初始机制需要鼠标当前的 X Y 坐标 这不需要单击和拖动 只需在浏览器窗口周围移动鼠标即可 现在我一直在研究有关触摸和手势的各种 jQuery Javascript 库
  • Apache Pig:本地模式下使用简单 GROUP BY 时出现 OutOfMemory 异常

    当我尝试在一个微小的 3KB 随机生成的示例数据集上执行一个非常简单的 GROUP BY 时 我收到了 Pig 的 OutOfMemory 异常 小猪脚本 cat example pig raw LOAD example data USIN
  • Glassfish - 来自同一客户端的同时连接

    我正在构建一个必须处理来自一个客户端的最多 300 个请求的应用程序 我已尝试此链接上建议的所有配置 Glassfish 线程池 接受器线程 HTTP 最大连接数 https stackoverflow com questions 3309
  • 使用 JMeter 发送带有二进制正文的 HTTP 请求

    我正在尝试使用 JMeter 发送带有二进制内容的 HTTP 请求 在文档中 我发现我可以发送带有二进制内容的文件 我认为这对于我的需求来说不是一个好的解决方案 因为每个请求都有自己的二进制内容 下面是我用 Perl 编写的客户端示例 演示
  • 如何制作一个简单的密码页面[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 小心 英语不好 我正在尝试创建一个页面 其中只有一个 小块 您可以在其中键入我设置的密码 如果您输入正确的密码并按 输入站点 按钮 您
  • GITLAB CI 管道未触发

    我已经为 GitLab CI CD 编写了这个 yml 文件 有一个已配置并正在运行的共享运行器 我是第一次这样做 不确定我哪里出错了 我正在进行的 Angular JS 项目 存储库上有一个 gulp 构建文件 并且在本地计算机上完美运行
  • 正则表达式 - 替换除 URL/URI 内的单词

    为 Web 应用程序编写全球化模块 我需要一个正则表达式来用另一个单词 翻译 替换一个单词的所有实例 除了在 URL URI 中找到的单词 编辑 我忘了提及我正在使用 Ruby 所以我不能使用 Lookbehind 根据 URI 正则表达式
  • 当前上下文中不存在错误但编译正常

    我遇到了一个我认为有点奇怪的问题 我收到两个 当前上下文中不存在 错误 Error 1 The name employeeDetails does not exist in the current context c users kelly
  • Qt/QML:将 QImage 从 C++ 发送到 QML 并在 GUI 上显示 QImage

    我创建了一个类Publisher它周期性地发出QImage目的 然而我很难画出QImage到 QML 元素 看来Image and CanvasQML 组件需要QUrl代替QImage 但我不知道如何转换我的QImage to a QUrl