- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
已解决:我做了所有像 eyllanesc answer 和我的 FirstPage.qml 里面的委托(delegate)我访问模型数据的地方我将 modelData 放在名称之前。以前在 FirstPage.qml 委托(delegate)中我使用了:名称、完成和未完成,现在我使用 modelData.name、modelData.completed 和modelData.未完成。现在一切都很好。
我是 QT/QML 的新手,我尝试过但找不到问题的答案。
我在 QML 中使用模型(用 C++ 创建)。当应用程序启动时,一切都很好,但是当我尝试向模型添加新元素时,它不会显示在 QML 中。模型从一开始就一样。
我有类 modcontroller 并在其中创建列表。
modcontroller.h
#ifndef MODCONTROLLER_H
#define MODCONTROLLER_H
#include <QObject>
#include <list.h>
class modcontroller : public QObject
{
Q_OBJECT
public:
explicit modcontroller(QObject *parent = nullptr);
QList<QObject*> getList();
Q_INVOKABLE void addList(QString nam);
signals:
void listChanged();
public slots:
private:
QList<QObject*> m_dataList;
};
#endif // MODCONTROLLER_H
modcontroller.cpp
#include "modcontroller.h"
#include <QDebug>
modcontroller::modcontroller(QObject *parent) : QObject(parent)
{
m_dataList.append(new List("Test"));
}
QList<QObject *> modcontroller::getList()
{
return m_dataList;
}
void modcontroller::addList(QString nam)
{
m_dataList.append(new List(nam));
qDebug() << "Function addList called";
qDebug() << m_dataList;
}
主要.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "list.h"
#include "modcontroller.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
modcontroller controller;
engine.rootContext()->setContextProperty("myModel", QVariant::fromValue(controller.getList()));
engine.rootContext()->setContextProperty("controller",&controller);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
在 QML 文件中,我有带有 model: myModel
的 ListView 和带有
onClicked: {
controller.addList(textInput.text)
myStackView.push(firstPage)
}
当我点击创建时,我只看到在开始时创建的第一个项目“测试”,但在控制台中我得到这个:
Function addList called
(List(0x2b7e60bc2c0), List(0x2b82d5891b0))
提前致谢。
主.qml
ApplicationWindow {
visible: true
width: 580
height: 360
title: qsTr("Hello World")
StackView{
id: myStackView
initialItem: firstPage
anchors.fill: parent
}
Component{
id: firstPage
FirstPage{}
}
Component{
id: createNewListPage
CreateNewListPage{}
}
}
第一页.qml
Item {
ListView{
id: lists
width: 150
height: childrenRect.height
x: 15
y: 70
model: myModel
delegate: Row{
width: 150
height: 25
spacing: 5
Rectangle{
width: {
if(uncompleted < 3){return 3;}
else if(uncompleted < 6){return 6;}
else {return 10;}
}
height: {
if(uncompleted < 3){return 3;}
else if(uncompleted < 6){return 6;}
else {return 10;}
}
radius: 10
color: "#494949"
anchors.verticalCenter: parent.verticalCenter
}
Button {
id:button1
height: 23
contentItem: Text {
id: textTask
text: name
font.underline: true
color: "blue"
font.bold: true
font.pointSize: 10
height: 20
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
}
background: Rectangle {
id: rectangle
color: "transparent"
}
states:[
State {
name: "Hovering"
PropertyChanges {
target: textTask
color: "white"
font.bold: true
font.underline: false
}
PropertyChanges {
target: rectangle
color: "blue"
}
}]
MouseArea{
hoverEnabled: true
anchors.fill: button1
onEntered: { button1.state='Hovering'}
onExited: { button1.state=''}
}
}
Text{
font.pointSize: 8
text: {
if(uncompleted == 0)return "";
return "- " + uncompleted + " left";
}
color: "#494949"
anchors.verticalCenter: parent.verticalCenter
}
}
}
}
创建新列表页面.qml
Item {
Rectangle{
width: 580
height: 360
Rectangle{
width: 350
height: 30
y: 100
x: 30
border.color: "#7b9cd3"
border.width: 1
TextInput {
id: textInput
anchors.topMargin: 3
cursorVisible: true
anchors.fill: parent
font.bold: true
font.pointSize: 14
}
}
Button{
height: 20
text: "Create this list"
onClicked: {
controller.addList(textInput.text)
myStackView.push(firstPage)
}
background: Rectangle{
id: rect1
anchors.fill: parent
radius: 20
border.color: "#88b6cf"
gradient: Gradient {
GradientStop { position: 0.0; color: "#fcfefe" }
GradientStop { position: 1.0; color: "#d5e8f3" }
}
}
}
}
}
最佳答案
列表是一个虚拟模型,因为它本身不会通知 View 是否有任何更改(例如元素数量),因此针对您的情况的解决方案是使其成为 mod_controller 的 Q_PROPERTY,然后当您添加项目时,标志 listChanged 将通知 View 某些内容已更改,因此需要重新绘制。不必从 Controller 中单独导出列表,因为 Q_PROPERTY 可以在 QML 中访问,所以解决方案是:
modcontroller.h
#ifndef MODCONTROLLER_H
#define MODCONTROLLER_H
#include <QObject>
class modcontroller : public QObject
{
Q_OBJECT
Q_PROPERTY(QList<QObject *> lists READ getList NOTIFY listsChanged) // <---
public:
explicit modcontroller(QObject *parent = nullptr);
QList<QObject *> getList() const;
Q_INVOKABLE void addList(const QString &nam);
Q_SIGNAL void listsChanged();
private:
QList<QObject*> m_dataList;
};
#endif // MODCONTROLLER_H
modcontroller.cpp
#include "modcontroller.h"
#include "list.h"
#include <QDebug>
modcontroller::modcontroller(QObject *parent) : QObject(parent)
{
m_dataList.append(new List("Test"));
}
QList<QObject *> modcontroller::getList() const
{
return m_dataList;
}
void modcontroller::addList(const QString & nam)
{
m_dataList.append(new List(nam));
qDebug() << "Function addList called";
qDebug() << m_dataList;
Q_EMIT listsChanged(); // <---
}
main.cpp
#include "modcontroller.h"
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
modcontroller controller;
engine.rootContext()->setContextProperty("controller",&controller);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
在 QML 的情况下,绑定(bind)是通过 Controller 的 Q_PROPERTY 列表完成的:
ListView{
// ...
model: controller.lists // <---
// ...
关于c++ - 用 C++ 创建的模型不能从 QML 修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55271179/
我是 javascript 的新手(今天开始弄乱它)。 我正在尝试更改名为“bar”的元素(div)的高度。条形图将成为图表的一部分。 我可以毫无问题地将按钮连接到更改栏高度的函数。一切正常,除了条形
错误 -> “UIVIew”没有名为“addSubView”的成员 override func viewDidLoad() { super.viewDidLoad() // Do an
我在命令行工具项目中复制并粘贴了 main.swift 下面链接中的代码。 How do you use CGEventTapCreate in Swift? 它构建没有错误,但是当我运行时, gua
我在尝试编译我的代码时遇到以下错误。 ERROR! ..\myCode\CPOI.cpp:68:41: error: cannot dynamic_cast 'screenType' (of type
我正在尝试将多个字符串连接到一个我已为其分配内存的字符串指针。这是一个例子: char *finalNumString = malloc(sizeof(char)*1024); finalNumStr
我在使用 dup2() 和 pipe() 时遇到问题。 当我尝试将管道的写入端 dup2 到 STDOUT_FILENO 时,我收到了 EBADF。 我用 gdb 在 dup2(pout[1], ST
首先,我应该说我运行的是 Windows 7。 因此,今天早上我尝试像往常一样从我的存储库中提取数据,但我做不到。我得到了错误: The authenticity of host 'github.co
刚开始在虚拟环境中运行Python,乱用Django,无法激活虚拟环境。 花了最后 4 个小时尝试在本地终端/VS 代码上激活虚拟环境 (venv),但没有成功。 避免使用“sudo pip inst
Tidyverse 的粉丝经常给出使用小标题而不是数据框的几个优点。它们中的大多数似乎旨在保护用户免于犯错误。例如,与数据框不同,小标题: 不需要 ,drop=FALSE不从数据中删除维度的论据。 不
我一直在对 Elm 应用程序进行 docker 化时遇到问题。据我所知,我已经创建了一个完整且有效的 Docker 文件……但它不起作用。 我会解释的。 所以我的脚本在 3 个文件中运行。 首先是启动
我可以在 Controller 中使用@Autowired,例如 @RestController public class Index { @Autowired HttpServlet
我定义了一个方法和一个函数: def print(str:String) = println val intToString = (n:Int) => n.toString 现在我想创作它们。 我的问
当我控制台单独记录变量“pokemons”时,它确实返回一个数组。但是当我尝试映射它时,出现错误: TypeError: pokemons.map is not a function 我的代码: im
每当我尝试在 Python 解释器中导入 smtplib 时,都会收到此错误: ImportError: cannot import name fix_eols 我该如何解决这个问题? 编辑:这是完整
我正在使用 Meteor.js 开发一个项目,但在使用 Handlebar 时遇到了一些问题:我想检索集合的最后一项,并显示字段:其中包含 html 的文本: 这是我的javascript代码: Te
你好,我想使用 Service 实现 GestureDetector 但是我有这个错误The method onTouchEvent(MotionEvent) of type GestureServi
我正在尝试在 Controller bean 中 Autowiring 接口(interface) 在我放置的上下文配置文件中 和 我的 Controller 类是 @Controller pub
我试图在 mainwindow.cpp 中包含 QtSvg,但是当我编译时它说无法打开包含文件:QtSvg。我已经在我的 *.pro 文件中添加了这个(QT += svg)。我可以知道可能是什么问题吗
鉴于以下 PostgreSQL 代码,我认为这段代码不容易受到 SQL 注入(inject)攻击: _filter 'day' _start 1 _end 10 _sort 'article_name
我想执行以下操作。这在 MySQL 中是非法的。 PostGRESQL 中关联的 CTE(“with”子句)有效。这里的假设是 MySQL 中的子查询不是完全限定的 CTE。 请注意:这个查询显然非常
我是一名优秀的程序员,十分优秀!