如何将一维整数数组从 QML 发送到 C++?
Posted
技术标签:
【中文标题】如何将一维整数数组从 QML 发送到 C++?【英文标题】:How to send a 1 dimensional integer array from QML to C++? 【发布时间】:2014-12-15 17:24:48 【问题描述】:所以我有一个信号:
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,除非我必须这样做,因为我看不到其他方法。
有人有什么建议吗?
【问题讨论】:
【参考方案1】:QML 支持 QList 和 javascript 值之间的转换,用于有限数量的类型。有关详细信息,请参阅documentation on type conversion。这些不需要使用 QVariant。
这样,从 JS 调用 C++ 方法就很简单了:
tester.h:
class Tester : public QObject
Q_OBJECT
public:
Q_INVOKABLE void bla(const QList<QString> &strings)
qDebug() << "Tester::bla():" << strings;
;
main.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 层,但反过来也可以。
【讨论】:
在 tester.cpp 我想实现一个大的让我们说 bla() 方法,它的语法是什么?是:void tester::bla(const QList<QString> &strings) ........
吗?
我是否正确理解您想要将bla()
的实现从.h 文件中的类内移动到.cpp 文件中的类外?那确实是 .cpp 文件中的void Tester::bla(const QList<QString> &strings) ...
。【参考方案2】:
将数组从 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);
;
在 main.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();
在 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
您可能还想查看这个:How to push values to QML property variant two dimensional array - dynamically?
【讨论】:
是的,使用属性甚至比 Q_INVOKABLE 方法更好,因为属性绑定比命令式调用某些方法更具声明性。 为了清楚使用什么,我再问你一个问题:我还有一个带有很多按钮和其他控件的 QML。单击按钮后,我想将我在 QML 中单击的按钮的 objectName 发送到 C++。然后 C++ 应该调用一个方法,该方法检查 buttonClicked 的 objectName 然后做一些事情。您已经很好地描述了如何将数组从 QML 发送到 C++。我想知道是否有类似的东西可以发送 objectName onButtonClicked。现在我正在为所有事情使用信号和插槽。它效果很好,但这是我的论文,我想要最好的。 @mshefiti 无需在任何地方发送任何对象名称。您可以简单地为每个按钮声明一个唯一 ID,然后将该 ID 发送到您想要的任何位置。 谢谢你的回答,它很有帮助@TheIndependentAquarius 谢谢@tmcguire,我也试过Q_Invokable,它工作得很好,但就我而言,使用属性绑定更有意义。以上是关于如何将一维整数数组从 QML 发送到 C++?的主要内容,如果未能解决你的问题,请参考以下文章