2017-07-28 18 views
0

Qtを初めて使っていて、C++スキルを向上させようとしていますので、QStringListで項目を検索できるプロジェクトを開始することにしました。テキストフィールド。私は検索機能が働いているので、検索の結果を別のQStringListに移動することができました。そこでは、 "パブリックスロット"として宣言された関数でユーザーに表示するために使用できます。C++でQStringListをQML ListViewに表示するにはどうすればいいですか?

主な考え方は、ユーザーが既にテキストフィールドに文字を入力すると自動的にリストが更新されることです。だから、結果リストをSlot関数に入れて毎回別のリストを表示させ、文字がテキストフィールドに入力されるようにしました。私は、検索結果のリストを渡す機能で


、私はresultModelはQMLの私のモデルの名前であり、m_resultListはのところ結果である。この

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

を使用しようとしています検索が保存され、リストがListViewに表示されます。私のプログラムはコンパイルされますが、実行した後にクラッシュします。

私の真の質問は、QML ListViewにmain.cppにないC++ QStringListを表示できる方法はありますか?

私がメインにいないことを求めている理由は、上記の同じ行を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.2 


ApplicationWindow { 
    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 
      } 
     } 
    } 

} 

答えて

2

あなたはそれが間違ってやっています。あらゆる可能な方法で。あなたは実際にはと設定されている関数をgetContext()という名前で呼んでいます。

m_resultListは、あなたが提供したコードの中に決して設定されません。実際のデータは謎であるため、アプリケーションがクラッシュする理由を説明する方法はありません。

QObject派生クラス(SearchClass)もあります。したがって、それをコンテキストプロパティとして公開してからQ_PROPERTYSearchClassとして実装することで、文字列リストをQMLにインターフェイスする必要があります。ここで

は簡単な例です:あなたはテキスト文字列を入力すると

// 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 } 
     } 
    } 
    } 

その後、スペースで区切られたトークンにそれを分割し、ためのモデルのソースとして使用されQStringListを設定する、Test::setModel()に送られますリストビュー。

関連する問題