2017-07-28 41 views
0

所以我是新來的Qt,我試圖提高我的C + +技能,所以我決定開始一個項目,我可以在QStringList中使用文本域。我使搜索功能正常工作,並且我能夠將搜索結果移動到另一個QStringList,在那裏我可以使用它來向用戶顯示一個聲明爲「公共時隙」的函數。我如何顯示一個QStringList在C++中的QML列表視圖

主要想法是,只要用戶將字符輸入到文本字段中,該列表就會自動更新,而字符已經存在。所以我設法將結果列表放到Slot函數中,以便每次顯示不同的列表並在文本字段中輸入字符。


在我通過在搜索結果列表中的功能,我想利用這個

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

其中resultModel是我在QML模型和m_resultList的名稱是哪裏的結果正在存儲搜索,以顯示ListView中的列表。我的程序編譯但運行後崩潰。

所以,我真正的問題是:有沒有什麼辦法可以將不在main.cpp中的C++ QStringList顯示到QML ListView中?

我要求它不在主要的原因是因爲我試圖在硬件編碼爲QStringList的main.cpp中使用上面的同一行,並且該列表能夠顯示,所以必須是不是主要問題。另外,因爲我無法使用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_PROPERTY實現與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 } 
     } 
    } 
    } 

作爲鍵入的文本串被送至Test::setModel(),然後將其分解成空間分隔的標記,並設置QStringList,其被用作用於模型源列表顯示。

相關問題