2014-11-12 6 views
4

Я пытаюсь реализовать ComboBox в QML и C++, в котором я могу динамически изменять содержимое моего ComboBox. Я предоставляю QStringList как ComboBox-Model и хочу вставить/удалить запись из ComboBox с помощью двух кнопок.QML dynamic ComboBox Entrys

Я могу отобразить QStringList в своем ComboBox, но когда я нажимаю кнопку Add-Button, мой QStringList обновляется в моем классе, но каким-то образом View не обновляет записи ComboBox. Что мне делать, чтобы показать View, что моя ComboBox-модель обновилась?

Это мой код:

comboboxmodel.h

#ifndef COMBOBOXMODEL_H 
#define COMBOBOXMODEL_H 

#include <QObject> 
#include <QStringList> 

class ComboBoxModel : public QObject 
{ 
    Q_OBJECT 

    Q_PROPERTY(QStringList comboList READ comboList WRITE setComboList NOTIFY comboListChanged) 
    Q_PROPERTY(int count READ count WRITE setCount NOTIFY countChanged) 

public: 
    ComboBoxModel(QObject *parent = 0); 
    ComboBoxModel(const QStringList &list,int count, QObject *parent = 0); 

    const QStringList comboList(); 
    void setComboList(const QStringList &comboList); 

    int count(); 
    void setCount(int cnt); 

    Q_INVOKABLE void addElement(const QString &element); 
    Q_INVOKABLE void removeElement(int index); 

signals: 

    void comboListChanged(); 
    void countChanged(); 

public slots: 


private: 

    QStringList m_comboList; 
    int   m_count; 
}; 

#endif // COMBOBOXMODEL_H 

comboboxmodel.cpp

#include "comboboxmodel.h" 
#include "qdebug.h" 

ComboBoxModel::ComboBoxModel(QObject *parent) : 
    QObject(parent) 
{ 
} 

ComboBoxModel::ComboBoxModel(const QStringList &list, int count, QObject *parent) : 
    QObject(parent), m_comboList(list), m_count(count) 
{ 

} 

const QStringList ComboBoxModel::comboList() 
{ 
    return m_comboList; 
} 

void ComboBoxModel::setComboList(const QStringList &comboList) 
{ 

    if (m_comboList != comboList) 
    { 
     m_comboList = comboList; 
     emit comboListChanged(); 
    } 

} 

int ComboBoxModel::count() 
{ 
    return m_count; 
} 

void ComboBoxModel::setCount(int cnt) 
{ 
    if (cnt != m_count) 
    { 
     m_count = cnt; 
     emit countChanged(); 
    } 
} 

void ComboBoxModel::addElement(const QString &element) 
{ 
    m_comboList.append(element); 
    emit comboListChanged(); 
    setCount(m_comboList.count()); 
    emit countChanged(); 

    for (int i = 0; i<m_count; i++) 
    { 
     qDebug() << m_comboList.at(i); 
    } 
} 

void ComboBoxModel::removeElement(int index) 
{ 
    if (index < m_comboList.count()) 
    { 
     m_comboList.removeAt(index); 
     emit comboListChanged(); 
     setCount(m_comboList.count()); 
     emit countChanged(); 
    } 

    for (int i = 0; i<m_count; i++) 
    { 
     qDebug() << m_comboList.at(i); 
    } 
} 

main.cpp

#include <QApplication> 
#include <QQmlApplicationEngine> 
#include <qqmlengine.h> 
#include <qqmlcontext.h> 
#include <qqml.h> 
#include <QStringList> 

#include "comboboxmodel.h" 

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 


    QQmlApplicationEngine engine; 
    ComboBoxModel combo; 

    QStringList tmp; 
    tmp << "1" << "2" << "3" << "4" << "5" << "6" << "7"; 
    combo.setComboList(tmp); 

    QQmlContext *ownContext = engine.rootContext(); 
    ownContext->setContextProperty("myModel", QVariant::fromValue(combo.comboList())); 

    QQmlContext *classContext = engine.rootContext(); 
    classContext->setContextProperty("comboModel", &combo); 

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

    return app.exec(); } 

main.qml

import QtQuick 2.3 import QtQuick.Controls 1.2 

ApplicationWindow { 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 

    menuBar: MenuBar { 
     Menu { 
      title: qsTr("File") 
      MenuItem { 
       text: qsTr("&Open") 
       onTriggered: console.log("Open action triggered"); 
      } 
      MenuItem { 
       text: qsTr("Exit") 
       onTriggered: Qt.quit(); 
      } 
     } 
    } 

    Text { 
     text: qsTr("Hello World") 
     anchors.centerIn: parent 
    } 

    ComboBox { 
     id: comboBox1 
     x: 258 
     y: 54 
     model: myModel 
     editable: true 
     onAccepted: { 
      if (editableCombo.find(currentText) === -1) { 
       model.append({text: editText}) 
       currentIndex = editableCombo.find(editText) 
      } 
     } 

    } 

    Button { 
     id: button1 
     x: 280 
     y: 139 
     text: qsTr("Remove Item") 
     onClicked: comboModel.removeElement(comboBox1.currentIndex) 
    } 

    Rectangle{ 
     x: 281 
     y: 316 
     width: 80 
     height: 20 
     color: "white" 

     TextEdit { 
      id: textEdit1 
      width: 80 
      height: 20 
      text: qsTr("Text Edit") 
      font.pixelSize: 12 
     } 
    } 

    Button { 
     id: button2 
     x: 280 
     y: 388 
     text: qsTr("Add Item") 
     onClicked: comboModel.addElement(textEdit1.text) 
    } } 
+0

Кто ответит на 'comboListChanged()'? Мне кажется, что мнение об этом не сообщается. Вы можете переназначить модель, чтобы увидеть изменения или расширить ['QAbstractListModel'] (http://qt-project.org/doc/qt-5/qabstractlistmodel.html) вместо QObject: она предоставляет подходящие функции, такие как' beginInsertRows () '; см. документацию об этом. – BaCaRoZzo

ответ

3

Так я finnaly понял, как делать такого рода вещи.

В main.qml должно быть:

model: comboModel.comboList 

вместо:

model: myModel 

Теперь я могу добавить/удалить элементы из моего списка, и они отображаются правильно.

Спасибо за ваш намек BaCaRoZzo.

Может кто-нибудь изменить эту тему на "Solved"?

+0

Нет проблем. Там нет «решены», я думаю, вы можете принять свой ответ. – BaCaRoZzo

Смежные вопросы