- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是 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
是您的主要 QQmlApplicationEngine
和 life
是您的 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/
Qt Quick Templates 弹出窗口与 QtQuick Controls 弹出窗口有什么区别? 我从 import QtQuick.Templates 2.0 与 import QtQuic
Qt Quick Templates 弹出窗口与 QtQuick Controls 弹出窗口有什么区别? 我从 import QtQuick.Templates 2.0 与 import QtQuic
当编写不使用 QML 且不依赖于新的 Qt 5 功能的 Qt 应用程序时,我们可以同时使用 Qt 4 和 Qt 5 对其进行编译(除了少数源代码不兼容)。 当我们想要使用 Qt 5 功能但又想退回到等
如何使用 QtQuick 2 绘制矩形并控制它是否显示左边框或右边框或两者? 最佳答案 Rectangle 中有一个 border 属性,允许您向元素添加边框。问题是你不能只显示左边框或右边框。为此,
我一直在寻找如何使我的QtQuick 2.0应用程序的背景透明。我发现的大多数答案都使用 QtDeclarative,这适用于 QtQuick 1.0,但不适用于版本 2。 最后我找到了一个答案,我将
经过几周的断断续续的研究,我仍然没有找到关于如何在 QtQuick 中执行翻译/本地化的全面指南(例如,使用 QML 语言,而不是 C++ 或 Python)。 一般来说,我问的是在 QtQuick
我需要在我的 QtQuick2 应用程序中支持具有相同分辨率的多屏幕。换句话说,当我感觉到辅助屏幕已连接时,我需要扩展我的应用程序。在 QtQuick2 中有可能吗? 最佳答案 我一直在使用 QtQu
我编写了一个 C++ 方法来查找所有串行端口,打开、写入和关闭并使用 Q_INVOKABLE 从 QML 调用此方法。在 QML 中,我首先将 LoadingPage.qml 推送到 StackVie
我有 Qt GUI 应用程序。主窗口包含使用窗口容器放置在其上的 QtQuick 组件: QQuickView * view = new QQuickView (); QWidget * contai
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 2年前关闭。 Improve thi
背景故事 所以我最近决定尝试使用 Qt。我开始制作 QtQuick 应用程序。在我的设计器 View 中,我有一个按钮和一个鼠标区域。 我想做什么: 当我单击按钮时,我想显示一个带有一些文本的消息框(
当调整 GridView 的大小时,它的元素被重新排列,该元素的动画似乎不起作用。 在这里你可以找到一个简单的例子:http://pastebin.com/BgST6sCv 如果单击示例中的其中一个方
我们正在尝试在 Visual Studio 2015 中运行 OpenVR 模拟器(链接 https://github.com/matzman666/OpenVR-InputEmulator)。构建成
我正在尝试缩放 QQuickPaintedItem,这样事情就会变大,但绘图质量不会变差(即随着项目变大重新触发绘画)。 setScale 方法和我想得到的类似,但是项目内容没有缩放,所以看起来很糟糕
在 Qt/C++ 中有 QT_DEBUG 定义宏来知道它何时在调试或发布时编译。 有什么方法可以知道应用程序是否在 QML 文件中以调试或 Release模式运行? 最佳答案 您可以使用 contex
尝试将 QtQuick.Dialogs 1.(0/1/2) 添加到我的项目时出现以下错误: qrc:/qml/main.qml:4 module "QtQuick.Dialogs" is not in
这个问题其实来自How to scroll to certain row in QML TreeView . QtQuick 项的一些属性是隐藏的,例如 TreeView 中的 __listView。
我想使用 QML 创建一个类似的 UI,如下面的链接所示,这是我在 pyqt5 中使用 Qcompleter 的问题, pyqt5 autocomplete QLineEdit - Google pl
我正在尝试编写一个 QtQuick 程序,它作为用户和一些 CLI 应用程序之间的智能接口(interface)。我已经实现了 QtQuick + JavaScript 应用程序。 QtQuick 按
这个问题在这里已经有了答案: How do I apply the style to a TextField in QML? It seems "style" attribute isn't ava
我是一名优秀的程序员,十分优秀!