QT — Как я могу отобразить QStringList в C ++ для QML ListView

Итак, я новичок в Qt и пытаюсь улучшить свои навыки C ++, поэтому я решил начать проект, где я могу искать элементы в QStringList, используя текстовое поле. Я получил работающую функцию поиска и смог переместить результат поиска в другой QStringListгде я могу использовать его для отображения пользователю в функции, которая объявлена ​​как «публичный слот».

Основная идея заключается в том, что список будет автоматически обновляться, как только пользователь вводит символ в текстовое поле, что он уже делает. Поэтому мне удалось получить полученный список в функцию «Слот», чтобы каждый раз отображать новый список и вводить символ в текстовое поле.


В функции, где я передаю в списке результатов поиска, я пытаюсь использовать это

m_context->setContextProperty("resultModel",QVariant::fromValue(m_resultList));

где resultModel это название моей модели в QML и m_resultList где хранятся результаты поиска, чтобы отобразить список в ListView, Моя программа компилируется, но после ее запуска происходит сбой.

Итак, мой настоящий вопрос: есть ли способ, чтобы я мог отобразить C ++ QStringList не в main.cpp в QML ListView?

Причина, по которой я прошу не указывать его в главном, состоит в том, что я пытался использовать ту же строку выше в main.cpp с жестко закодированным QStringList и список был в состоянии отобразить, поэтому должна быть проблема с ним не быть в основном. Кроме того, потому что я не смог бы использовать функцию слота в SearchClass для автоматического обновления.


main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QDebug>
#include "searchclass.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);

qmlRegisterType<SearchClass>("b9c.backend", 1, 0, "BackEnd");

QQmlApplicationEngine engine;

SearchClass obj;

engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

QQmlContext *context = engine.rootContext();

obj.getContext(context);

//the line below works if provided with a qstringlist

//context->setContextProperty("resultModel", QVariant::fromValue(resultList));

return app.exec();
}

SearchClass.h

#ifndef SEARCHCLASS_H
#define SEARCHCLASS_H

#include <QObject>
#include <QQmlContext>

class SearchClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QString userSearch READ userSearch WRITE setUserSearch NOTIFY userSearchChanged)

public:
SearchClass(QObject *parent = 0);

QStringList resultList;

QString userSearch();
void setUserSearch(QString &userSearch);

void getFilenameAndInput(QString inputString);
QString CompareInputAndFilename(QString inputString, QString filename);
QStringList getFileName();

//get context
void getContext(QQmlContext *context);

signals:
void userSearchChanged();

public slots:
void setUserSearch();

private:
QStringList m_resultList;
QString m_userSearch;
QQmlContext* m_context;
};

#endif // SEARCHCLASS_H

SearchClass.cpp

#include "searchclass.h"#include <QDebug>
#include <QQmlContext>
#include <QGuiApplication>
#include <QQmlApplicationEngine>SearchClass::SearchClass(QObject *parent) : QObject(parent)
{
connect(this, SIGNAL(userSearchChanged()), this, SLOT(setUserSearch()));
}

//the result should be displayed in this SLOT when ever the user types in a character into the textfield
void SearchClass::setUserSearch(){

qDebug() << "SLOT: " << m_resultList;

//The line below makes the program crash. It works when implemented in the main.cpp
//    m_context->setContextProperty("resultModel", QVariant::fromValue(m_resultList));

}

QString SearchClass::userSearch()
{
return m_userSearch;
}

void SearchClass::setUserSearch(QString &userSearch)
{
if (userSearch == m_userSearch)
return;

m_userSearch = userSearch;

qDebug() << "Input: " <<m_userSearch;

getFilenameAndInput(m_userSearch);

emit userSearchChanged();
}

QStringList SearchClass::getFileName(){

//Returns the items that will be searched for...

}

void SearchClass::getFilenameAndInput(QString inputString){

//Puts the search results into class variable m_resultList...

m_resultList = resultList;

}

QString SearchClass::CompareInputAndFilename(QString inputString, QString filename){

//Search processing...

}

//gets context to use setProperty in the above signal, but it crashes
void SearchClass::getContext(QQmlContext *context){

m_context = context;

}

main.qml

import QtQuick 2.6
import QtQuick.Controls 2.0
import b9c.backend 1.0
import QtQuick.Window 2.2ApplicationWindow {
id: root
width: 300
height: 480
visible: true
BackEnd { id: backend }

TextField {
id: txtfield
text: backend.userSearch
placeholderText: qsTr("Search...")
width: parent.width

onTextChanged: backend.userSearch = text
}

ListView {
id:view
height: parent.height
width: parent.width
y: 5 + txtfield.height
model: resultModel

delegate: Rectangle {
border.color: "lightblue"height: 25
width: parent.width
Text {
anchors.centerIn: parent
text: modelData
}
}
}

}

1

Решение

Вы делаете это не правильно. Всеми возможными способами. Вы даже имя getContext() функция, которая на самом деле наборы контекст.

m_resultList никогда не устанавливается на что-либо в указанном вами коде. Поэтому невозможно объяснить, почему происходит сбой вашего приложения, потому что фактические данные являются загадкой.

У вас также есть QObject производный класс — ваш SearchClass, Таким образом, вы должны представить это как свойство контекста, а затем связать список строк с QML, реализовав его как Q_PROPERTY из SearchClass,

Вот простой пример:

// the equivalent of your SearchClass
class Test : public QObject {
Q_OBJECT
Q_PROPERTY(QStringList model MEMBER m_model NOTIFY modelChanged)
QStringList m_model;
public slots:
void setModel(QString m) {
m_model = m.split(" ");
modelChanged();
}
signals:
void modelChanged();
};

// in main.cpp
Test t;
engine.rootContext()->setContextProperty("Test", &t);

// in main.qml
Column {
TextField {
onTextChanged: Test.setModel(text)
}
ListView {
width: 200; height: 300
spacing: 5
model: Test.model
delegate: Rectangle {
height: 25
width: 200
color: "lightgray"Text { text: modelData; anchors.centerIn: parent }
}
}
}

По мере ввода текстовая строка отправляется Test::setModel(), который затем разбивает его на разделенные пробелами токены и устанавливает QStringList, который используется в качестве источника модели для представления списка.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]