【问题标题】:QModelIndex to QJSValueQModelIndex 到 QJSValue
【发布时间】:2017-01-11 13:18:11
【问题描述】:

我尝试重新实现QSortFilterProxyModelfilterAcceptsRow(int source_row, const QModelIndex &source_parent)-方法。

这里我想调用一个可调用的QJSValue 并将两个参数传递给它。为此,我需要将它们放在QJSValueList 中,这对于整数来说很容易。

但我找不到对QModelIndex 执行相同操作的方法。

  • 没有JSValue 的构造函数接受QModelIndex
  • QJSEngine::createQObject 接受一个我没有的 QObject。

我有成功的机会吗?

编辑:我现在尝试了什么

bool FilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
    if (m_filter.isCallable()) {  // check whether a JS-Function is set
        QJSValueList l;
        QJSValue f = QJSValue(m_filter);
        l << QJSValue(source_row);

        // **** ADD MORE USEFULL STUFF HERE ****
        // This is working now - thanks to your help. But useless in QML
        QJSEngine *engine = m_filter.engine();
        l << engine->toScriptValue(source_parent);// <-- Value is of no use in QML. Can't do anything with it. And for ListModels as source utterly useless

// V----- To add this would make more sense, but the app crashes. Don't call index()!!!     
//        l << engine->toScriptValue(index(source_row, 0, source_parent));
        return f.call(l).toBool();
    }
    // If no JS-Function is set, fall back to the original method
    return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
}

请原谅我任何微不足道的错误。距离我上次使用(并开始学习)C++ 已有 5 年了。

【问题讨论】:

  • QModelIndex 直接在DelegateModel 中使用,这意味着您应该能够将其包装在QVariant 中。
  • 是的,可以将其包装在 QVariant 中,但我仍然无法从中获得 QJSValue。也没有toQJSValue()QJSValue-构造函数接受QVariantQVariant 也不是QObject,所以还是不能传给QJSEngine::createQObject-factory。
  • 为什么?你打算用它做什么?您只能将 QJSValue 用于 QObject 引用和原始类型。不需要更多。
  • 好吧,您总是可以编写自己的转换函数来创建一个包含所需模型索引成员的 JS 对象。从外观上看,模型索引是 QML 中的一种不透明类型——你可以传递它,但它不能直接从 JS 代码中使用。所以你必须手动转换。
  • 我还在我仍然未充分测试和记录不足的库 github.com/oKcerG/SortFilterProxyModel 中实现了它。用法为filters: ExpressionFilter { expression: /* an expression that evaluates to a bool. You can access roles and index here like in a delegate */ }

标签: javascript c++ qt qml


【解决方案1】:

从你的描述中我不太确定你在做什么,但假设你有一个QModelIndex(在 C++ 中)并且出于某种原因想要一个QJSValue,那么我认为QJSEngine::toScriptValue 确实是你想。这可能应该从QJSValue 文档链接,我会尝试在未来的版本中修复它。

我自己从来没有这样做过,但是这样的事情应该可以工作:

QJSEngine *e; /* I assume you've got this already somewhere .. */
QModelIndex m = something->index(...); /* and you have a model index */
QJSValue val = e->toScriptValue(m);
// go ahead and use val!

如果你想走另一个方向,即从 QJSValue 中拆箱 QModelIndex:

QJSValue val = something->prop(); // now to extract it...
QModelIndex m = e->fromScriptValue<QModelIndex>(val);
// go ahead and use m!

QVariantQJSValue 都是可以包含不同类型数据的动态“盒子”,所以你不想加倍给 QML 相当于 QJSValue(QVariant(QModelIndex))(不会编译,只是为了演示存储),因为它不知道如何正确拆箱。

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多