- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我制作这个类是为了将它用作数据容器。我从 json 中读取了一些数据(在 C++ 中)并填充了我存储在 dataHandler 的 m_guiAreas 列表中的 GUIArea 列表。在 QML 的某个时刻,我向 dataHandler 请求了一系列 selectedAreas。 DataHandler 填充 QList m_selectedGuiAreas 并发出 selectedAreasChanged() 信号。现在我希望看到一个矩形网格,其中填充了选定的数据,但我什么也没看到。在 C++ 级别,当发出 selectedAreasChanged() 时,m_selectedGuiAreas 结果填充了正确的数据,但在 QML 级别,它似乎是空的,或者数据可能没有正确读取。
这是我用作包装器将数据带到 QML 级别的类:
class GUIArea : public QObject
{
Q_OBJECT
Q_PROPERTY(QString id READ id )
Q_PROPERTY(QString configurations READ configurations )
...
public:
explicit GUIArea(QObject *parent = nullptr): QObject (parent) {}
QString id() {return m_id;}
void id(QString newId) {m_id = newId;}
QString configurations() {return m_configuration; }
void configurations(QString newConfiguration) {m_configuration = newConfiguration;}
...
private:
QString m_id;
QString m_configuration;
};
下面是 dataHandler 类,我在其中声明从 Json 读取的数据列表,并将其从 Qlist 转换为 QQmlPropertyList(我在一些 QML 指南中看到了将 c++ 属性公开给 QML)。initializeDatas 方法读取存储在 m_GUIAreas 中的数据,然后在 m_selectedGUIAreas 中选择要发送到 QML 的数据,最后发出信号 selectedGUIAsChanged()。
class dataHandler : public QObject
{
Q_OBJECT
Q_PROPERTY(QQmlListProperty<GUIArea> selectedGuiAreas READ selectedGuiAreas NOTIFY selectedAreasChanged)
public:
explicit dataHandler(QObject *parent = nullptr);
static dataHandler* instance();
QQmlListProperty<GUIArea> selectedGuiAreas();
...
public slots:
void initializeDatas(const json& blocksList);
...
signals:
...
void selectedAreasChanged();
...
private:
...
QList<GUIArea *> m_guiAreas;
QList<GUIArea *> m_selectedGuiAreas;
};
在主文件中,dataHandler 被声明为一个属性:这是代码:
QQuickView view;
...
view.engine()->rootContext()->setContextProperty("dataHandler", dataHandler::instance());
...
view.show();
下面是我想在 QML 中可视化的页面的一部分。AreaButton 是 Text 中的一个 Rectangle 和属性文本的别名。
Grid {
id: areasButtonsGrid
columns: 4
anchors.fill: parent
Repeater {
model: dataHandler.selectedGuiAreas
delegate:
AreaButton {
text: qsTr(model.modelData.programName)
}
}
}
最佳答案
代码不完整,无法分析,所以我只提供一个工作代码,以便您分析问题所在:
main.cpp
#include <QGuiApplication>
#include <QQmlContext>
#include <QQuickView>
#include <QTimer>
class GUIArea : public QObject
{
Q_OBJECT
Q_PROPERTY(QString id READ id CONSTANT)
Q_PROPERTY(QString configurations READ configurations CONSTANT)
public:
GUIArea(const QString & id="", const QString & configurations="", QObject *parent=nullptr):
QObject(parent), m_id(id), m_configurations(configurations)
{}
QString id() const{return m_id;}
QString configurations() const{return m_configurations;}
void setId(const QString &id){
m_id = id;
}
void setConfigurations(const QString &configurations){
m_configurations = configurations;
}
private:
QString m_id;
QString m_configurations;
};
class DataHandler: public QObject
{
Q_OBJECT
Q_PROPERTY(QQmlListProperty<GUIArea> selectedGuiAreas READ selectedGuiAreas NOTIFY selectedAreasChanged)
using QObject::QObject;
public:
static DataHandler& instance(){
static DataHandler handler;
return handler;
}
QQmlListProperty<GUIArea> selectedGuiAreas(){
return QQmlListProperty<GUIArea>(this, m_selectedGuiAreas);
}
void append(GUIArea *area){
if(area){
m_selectedGuiAreas << area;
emit selectedAreasChanged();
}
}
signals:
void selectedAreasChanged();
private:
QList<GUIArea *> m_selectedGuiAreas;
};
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
qmlRegisterType<GUIArea>();
QQuickView view;
view.rootContext()->setContextProperty("dataHandler", &DataHandler::instance());
view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
view.show();
QTimer timer;
static int counter =0;
QObject::connect(&timer, &QTimer::timeout, [](){
GUIArea *area = new GUIArea(QString::number(counter),
QString("configuratio-%1").arg(counter),
&DataHandler::instance());
DataHandler::instance().append(area);
counter++;
});
timer.start(1000);
return app.exec();
}
#include "main.moc"
main.qml
import QtQuick 2.12
Grid {
id: areasButtonsGrid
columns: 5
width: 640
height: 480
spacing: 20
Repeater {
model: dataHandler.selectedGuiAreas
delegate:
Rectangle{
width: 100
height: 100
color: "blue"
Text {
anchors.fill: parent
text: qsTr(model.modelData.configurations)
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
}
}
}
}
关于c++ - 为什么我不能从 QML 读取暴露的 C++ 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54306645/
我对 DBT 还很陌生,正在尝试探索如何进行曝光。我已经阅读了文档 ( https://docs.getdbt.com/docs/building-a-dbt-project/exposures ),
我对 DBT 还很陌生,正在尝试探索如何进行曝光。我已经阅读了文档 ( https://docs.getdbt.com/docs/building-a-dbt-project/exposures ),
这在Python中合法吗?似乎有效... 谢谢 # with these lines you not need global variables anymore if __name__ == '__m
我正在尝试使用 tomcat Docker 镜像打包一个 war 文件。我正在尝试在图像中公开 tomcat 端口以供外部访问。 这是我的docker文件 FROM tomcat8:3.0.0 C
我一直在尝试通过 ip 连接到 docker 容器,但再次失败。当我使用“docker inspect container-id”时,我得到了这个结果。 我的虚拟盒子默认设置是: 有人可以帮我解决这个
我知道要在 docker 容器中公开端口,您可以使用 -p标志(例如 -p 1-100:1-100 )。但是有没有一种很好的方法可以将大部分可能的端口从容器暴露给主机?例如,如果我在位于 VM 中的容
我正在开发一个带有 ktor 应用程序的 Kotlin,并且我使用暴露为 ORM。我有一个引用另一个表的表。这种关系是多对一的。前任: object Users : IdTable() { ov
我正在尝试学习 polymer ,并且正在尝试制作一个基本的消息传递框架。所以我创建了一个名为 messages-framework 的小 polymer 元素,它将显示消息,并在 3 秒后删除该消息
我的问题很简单也很笼统:当调用 RESTFUL API 时,无论是我的还是外部的,将 token 暴露在前端是否是常见做法/可以?例如,在 Google map api 的文档中,他们建议使用以下代码
我们有一个包含 1000 万条记录的数据库表。我们不想使用 auto_increment,因为那样会让我们的用户知道我们有多少条记录。我们不想将其暴露给我们的竞争对手。我看到的问题是使用 UUID 或
我有以下用户表对象和实体类: object UserTable : IntIdTable() { val name = varchar("name", 256) } class User(id
对于部署在 Google kubernetes 引擎上的基于微服务的示例架构,我需要帮助来验证我的理解: 我们知道服务应该对 pod 副本集的流量进行负载平衡。 当我们创建一个 nginx 入口 Co
String caminhoFoto = getExternalFilesDir(null) + "/"+ System.currentTimeMillis() +".jpg";
我目前正在编写一个用 Parcel js 打包的 TypeScript 模块化库。应用程序将使用该库来实现特定功能。消费应用程序/网页将在其 html 中添加对我的库的引用,例如。 我想在我的库中公
mongodb 生成的 ID 在您的所有文档中都是唯一的,将其暴露给客户端的风险是什么?就像我有一个 ID 为 12345676543 的用户名 James,将它暴露给 url 是明智的吗 examp
场景:假设攻击者通过对.apk文件进行逆向工程,获取了应用中使用的Push Registration Service的SENDER ID。攻击者开发了一个类似的虚假应用程序,它具有相同/不同的包名,并
当使用 Spring Boot starter 进行 graphql 时,数据获取时抛出的所有异常都在输出控制台中显示为“执行查询时的内部服务器错误”我希望我抛出的 e.message() 的 Gra
我正在尝试使用 Docker 运行 ASP.NET Core 应用程序,并且我想将外部 wwwroot 文件夹公开给容器,以便当我从外部对其进行更改时,它们会自动对我的应用程序可用。这可能吗,使用卷?
我构建了一个 WCF 服务,它为 Web 应用程序公开自身,它接受一个对象并在客户端机器上打印数据。在我的开发机器上运行良好,该服务在我安装它的任何机器上启动并运行。我可以在客户端机器的 Web 浏览
我似乎无法弄清楚这一点。我有一个使用 scikit-learn 训练的模型,保存到一个 .pkl 文件中,我想制作一个 API 来根据它进行预测。 我已经有了进行预测的代码,它在控制台/单元测试中运行
我是一名优秀的程序员,十分优秀!