如何将一维整数数组从 QML 发送到C++
How to send a 1 dimensional integer array from QML to C++?
所以我有一个信号:
QML:
signal qmlSendWorkflowIdsArraySignal(variant workflowIdsArray)
.JS:
sendToCppWorkflowIdsArray(arrayOfWorkflowIds);
C++:
QObject::connect(qmlMainContentItemObject, SIGNAL(qmlSendWorkflowIdsArraySignal(QVariant)), &myController, SLOT(qmlToCppWorkflowIdsArraySlot(QVariant)));
C++插槽:
void qmlToCppWorkflowIdsArraySlot(QVariant workflowIdsArray)
{
qDebug() << " +++++++++++++++ Cpp Array slot has been called: "<<workflowIdsArray;
}
输出:
+++++++++++++++ Cpp Array slot has been called:
QVariant(QVariantList, (QVariant(QString, "2") , QVariant(QString, "3") , QVariant(QString, "4") ) )
- 我如何在 QVariant 中阅读这个 QVariantList,即,假设我想要读取数组的第一个元素,即 QVariant(QString,"2"),然后是另一个和另一个。这看起来很复杂,就像这。
- 我所需要的只是将整数数组从 QML 传递到 C++,所以我可以读取此数组。我不想使用 QVariant 或 QVariantList,除非我必须这样做,因为我认为没有其他方法可以做到这一点。
有人有什么建议吗?
QML支持QList和Javascript值之间的转换,适用于有限数量的类型。有关详细信息,请参阅有关类型转换的文档。无需为这些使用 QVariant。
有了这个,从JS调用C++方法很容易:
测试人员.h:
class Tester : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE void bla(const QList<QString> &strings) {
qDebug() << "Tester::bla():" << strings;
}
};
主.cpp:
Tester tester;
viewer.engine()->rootContext()->setContextProperty("_tester", &tester);
QML:
onClicked: _tester.bla(["asdf", "foo", "bar"]);
请注意,我在这里没有使用信号 - 在您的情况下,信号是从C++代码连接的,其中C++代码从 QML 层访问对象。我尽量避免这种情况,强制C++层和QML层之间更清晰的分离,这使得完全更改QML代码而无需适应C++层成为可能。C++层永远不应该到达QML层,反之亦然。
将数组从 QML 传递到 C++ 的一种方法如下:
创建一个将接收该整数数组的类:
DataReceiver.h
#include <QQuickItem>
#include <QList>
class Receiver : public QQuickItem
{
private:
Q_OBJECT
Q_PROPERTY (QList<int> xx READ xx WRITE setXX NOTIFY xxChanged)
QList<int> m_xx;
public:
Receiver (QQuickItem *parent = 0) {}
QList<int> xx() const
{
return m_xx;
}
public slots:
void setXX (QList<int> arg)
{
if (m_xx != arg) {
m_xx = arg;
emit xxChanged (arg);
}
}
signals:
void xxChanged (QList<int> arg);
};
主要.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "DataReceiver.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
const char* ui = "HELLO"; // @uri HELLO
qmlRegisterType <Receiver> (ui, 1, 0, "DataReceiver");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
return app.exec();
}
In QML (main.qml)
import QtQuick 2.2
import QtQuick.Window 2.1
import HELLO 1.0
Window
{
visible: true
width: 360
height: 360
id: head
property variant myArray: [1,2,3]
DataReceiver
{
id: dataReceiver
xx: head.myArray
}
}
您可能还想检查一下:
如何将值推送到 QML 属性变体二维数组 - 动态?
相关文章:
- 从C++实例化QML
- 使用CMake创建QML插件
- QT通过C++添加映射QML项目
- 如何在没有信号的情况下从C++执行QML插槽
- QML按钮点击功能执行顺序
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 建议在运行时将带有类实例的列表从c++导入qml
- Qt Quick-如何仅从c++代码与qml属性交互
- 如何将带有自定义对象的容器从C++传递到QML
- QML 使用带有参数C++函数
- 最佳做法是从另一个线程访问 qml 中的Q_PROPERTY
- 如何从C++端挂接到 QML 项的 onClick 事件
- 在 qml 中使用 Q_ENUM 和 Q_PROPERTY 作为枚举类
- 从C++更改 QML 图像源
- QML TableView 使用 QtQuick.Controls 2 单击行
- 如何多次询问来自QML对话框的输入?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 阅读 QML 中结构C++ QVector 的 QVector
- 如何使用connect将qml按钮与同一类的cpp函数连接起来
- Qt QML桌面应用程序自动化测试