gpt4 book ai didi

c++ - QtQuick、动态图像和 C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:03 25 4
gpt4 key购买 nike

我是 Qt 的新手,根据我在 qt-project.org 上阅读的内容和其他地方; QtQuick 似乎是一个有吸引力的选择,因为它能够在基于指针和触摸的设备上工作。我的问题是让它与 c++ 一起工作。

我决定在“Hello World”之后编写康威生命游戏的一个变体作为下一步。对于如何将“板”——一个 [高度][宽度][每像素字节数] 字符数组——集成到场景图中,我感到非常困惑。

基本上,该过程是“LifeBoard”遍历其规则并更新 char*/image。我有这个简单的 QML:

:::QML
ApplicationWindow {
id: life_app_window
visible: true
title: qsTr("Life")

menuBar: MenuBar {
Menu {
title: qsTr("File")
MenuItem {
text: qsTr("Quit")
onTriggered: Qt.quit();
}
}
}

toolBar: ToolBar {
id: lifeToolBar;
ToolButton {
id: toolButtonQuit
text: qsTr("Quit")
onClicked: Qt.quit()
}
ToolButton {
id: toolButtonStop
text: qsTr("Stop")
enabled: false
//onClicked:
}
ToolButton {
id: toolButtonStart
text: qsTr("Start")
enabled: true
//onClicked: //Start life.
}
ToolButton {
id: toolButtonReset
text: qsTr("Stop")
// onClicked: //Reset life.
}
}

Flow {
id: flow1
anchors.fill: parent
//*****
// WHAT GOES HERE
//*****
}

statusBar: StatusBar {
enabled: false
Text {
// Get me from number of iterations
text: qsTr("Iterations.")
}
}
}

我想图像来自一个类,它的 api 有点像这样:

class Life {
public:
QImage getImage() {}
// Or
char* getPixels(int h, int w, QImage::Format_ARGB8888) {}
}

我毫 headless 绪,花费数小时浏览教程也无济于事。如何将 C++ 中的 char* 图像链接到 ???在 QML 中,以便 QML 可以启动/停止“Life”循环,以便“Life”循环并更新 char 数组并通知 QML 重绘它?


注意:我已经根据信息 here 查看了 QQuickImageProvider 的子类化.这种方法的问题是我看不到如何让 C++“驱动”屏幕图像。我希望将控制权从 QML 传递给 c++,让 c++ 告诉 QML 何时用更改后的图像更新显示。这种方法有解决方案吗?或者完全是另一种方法。

最佳答案

第一种方法是创建一个 Rectangle对于 QML 中的每个游戏像素,这可能适合 8x8 的棋盘,但不适用于 100x100 的棋盘,因为您需要为每个像素手动编写 QML 代码。

因此,我会选择用 C++ 创建并暴露给 QML 的图像。你通过 image provider 给他们打电话允许异步加载。让 Life 只做逻辑。

像这样从 QML 调用图像:

Image {
id: board
source: "image://gameoflife/board"
height: 400
width: 400
}

现在 gameoflife 是图像提供者的名称,board 是您稍后可以使用的所谓 id

在你的main.cpp中注册gameoflife

LifeImageProvider *lifeIP = new LifeImageProvider(life);
engine.addImageProvider("gameoflife", lifeIP);

engine 是您的主要 QQmlApplicationEnginelife 是您的 Life 游戏引擎的实例。

LifeImageProvider 是您创建像素数据的类。以某种方式开始

class LifeImageProvider : public QQuickImageProvider
{
public:
LifeImageProvider(Life *myLifeEngine);
QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize);

private:
Life *myLifeEngine_;
};

重要的方法是requestPixmap ,这是从 QML 调用的。您需要实现它。

要在 Life 发送 stateChanged() 信号时刷新游戏板,将 life 作为全局对象公开给 QML:

context->setContextProperty("life", &life);

可以将信号绑定(bind)到QML

Image {
id: board
source: "image://gameoflife/board"
height: 400
width: 400
}

Connections {
target: life
onStateChanged: {
board.source = "image://gameoflife/board?" + Math.random()
// change URL to refresh image. Add random URL part to avoid caching
}
}

关于c++ - QtQuick、动态图像和 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23667088/

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