64void QQmlFunctionFilter::componentComplete()
66 Q_D(QQmlFunctionFilter);
67 const auto *metaObj = metaObject();
68 for (
int idx = metaObj->methodOffset(); idx < metaObj->methodCount(); idx++) {
70 QMetaMethod method = metaObj->method(idx);
71 if (method.nameView() ==
"filter") {
77 if (!d->m_method.isValid())
80 if (d->m_method.parameterCount() != 1) {
81 qWarning(
"filter method requires a single parameter");
85 QQmlData *data = QQmlData::get(
this);
86 if (!data || !data->outerContext) {
87 qWarning(
"filter requires a QML context");
91 QQmlRefPointer<QQmlContextData> context = data->outerContext;
92 QQmlEngine *engine = context->engine();
94 const QMetaType parameterType = d->m_method.parameterMetaType(0);
95 auto cu = QQmlMetaType::obtainCompilationUnit(parameterType);
96 const QQmlType parameterQmlType = QQmlMetaType::qmlType(parameterType);
98 if (!parameterQmlType.isValid()) {
99 qWarning(
"filter method parameter needs to be a QML-registered type");
113 if (parameterType.flags() & QMetaType::PointerToQObject) {
114 QObject *created =
nullptr;
115 if (parameterQmlType.isInlineComponentType()) {
116 const auto executableCu = engine->handle()->executableCompilationUnit(std::move(cu));
117 const QString icName = parameterQmlType.elementName();
118 created = QQmlObjectCreator(context, executableCu, context, icName).create(
119 executableCu->inlineComponentId(icName),
nullptr,
nullptr,
120 QQmlObjectCreator::InlineComponent);
121 }
else if (parameterQmlType.isComposite()) {
122 const auto executableCu = engine->handle()->executableCompilationUnit(std::move(cu));
123 created = QQmlObjectCreator(context, executableCu, context, QString()).create();
125 created = parameterQmlType.metaObject()->newInstance();
128 const auto names = d->m_method.parameterNames();
129 created->setObjectName(names[0]);
130 d->m_parameterData = QVariant::fromValue(created);
132 d->m_parameterData = QVariant(parameterType);
139bool QQmlFunctionFilter::filterAcceptsRowInternal(
int row,
const QModelIndex& sourceParent,
const QQmlSortFilterProxyModel *proxyModel)
const
141 Q_D(
const QQmlFunctionFilter);
142 if (!d->m_method.isValid() || !d->m_parameterData.isValid())
147 QSortFilterProxyModelHelper::setProperties(
148 &d->m_parameterData, proxyModel,
149 proxyModel->sourceModel()->index(row, column(), sourceParent));
150 void *argv[] = {&retVal, d->m_parameterData.data()};
151 QMetaObject::metacall(
152 const_cast<QQmlFunctionFilter *>(
this), QMetaObject::InvokeMetaMethod,
153 d->m_method.methodIndex(), argv);
155 const int columnCount = proxyModel->sourceModel()->columnCount(sourceParent);
156 for (
int column = 0; column < columnCount; column++) {
157 QSortFilterProxyModelHelper::setProperties(
158 &d->m_parameterData, proxyModel,
159 proxyModel->sourceModel()->index(row, column, sourceParent));
160 void *argv[] = {&retVal, d->m_parameterData.data()};
161 QMetaObject::metacall(
162 const_cast<QQmlFunctionFilter *>(
this), QMetaObject::InvokeMetaMethod,
163 d->m_method.methodIndex(), argv);