2016-01-15 3 views
1

У меня есть две поля со списком, данные для второго определяются тем, что у первого. Количество строк во втором поле со списком колеблется от 2 до 4. Если я:Внедрение интерактивного комбинированного блока C++/QML

  1. выбрать новую строку в первом поле и
  2. последний выбор выбран во втором поле со списком с длинный список, чем предыдущий список , что коробка,

currentString во втором поле со списком остается и переопределяет правильный текст

например, если выбрать SCUBAPRO в первом поле (4 варианты в 2-м ящике) и Smart во втором поле со списком (4-й вариант), затем снова выберите любой другой вариант в первом поле со списком (< 4 варианта во втором поле), запись во втором поле со списком остается «Smart», что неуместно. Однако правильный список загружается во второй поле со списком. Проверка основного строкового списка также предполагает, что он содержит правильные данные. Проблема заключается в визуальном обновлении второго комбинированного блока. Сердце алгоритма исходит от Stackoverflow и является генератором, называемым каждый раз, когда текст в поле со списком 1 изменяется. Что можно сделать, чтобы исправить это?

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 
#include <QQuickWindow> 
#include <QQuickView> 
#include <QQuickItem> 
#include <QStringListModel> 
#include <QQmlContext> 
#include <QDebug> 

QStringList dat1, dat2, dat3; 
QStringList vendorList; 

class Generator : public QObject 

    Q_OBJECT 
    QStringListModel * m_model; 
public: 
    Generator(QStringListModel * model) : m_model(model) {} 
    Q_INVOKABLE void generate(const QVariant & val) { 

     m_model->removeRows(0,m_model->rowCount()); // This has no effect 

     if (QString::compare(val.toString(), QString::fromStdString("Mares"), Qt::CaseInsensitive) == 0) { 
      m_model->setStringList(dat1); 
     } 
     else { 
      if (QString::compare(val.toString(),  QString::fromStdString("ScubaPro"), Qt::CaseInsensitive) == 0) { 
       m_model->setStringList(dat2); 
      } 
      else 
       m_model->setStringList(dat3); 
     } 

}; 


int main(int argc, char *argv[]) 
{ 
    QStringListModel model1, model2; 
    generator(&model2); 

    dat1 << "Puck" << "Nemo" << "Matrix"; 
    dat2 << "Aladin" << "Meridian" << "Galilio" << "Smart"; 
    dat3 << "D4" << "D6"; 
    vendorList << "Mares" << "Scubapro" << "Suunto" << "Shearwater"; 
    model1.setStringList(vendorList); 

    QGuiApplication app(argc, argv); 
    QQuickView view; 

    QQmlContext *ctxt = view.rootContext(); 
    ctxt->setContextProperty("model1", &model1); 
    ctxt->setContextProperty("model2", &model2); 
    ctxt->setContextProperty("generator", &generator); 

    view.setSource(QUrl("qrc:main.qml")); 
    view.show(); 

    return app.exec(); 
} 

#include "main.moc" 

Вот QML:

import QtQuick 2.0 
import QtQuick.Controls 1.0 

Rectangle { 
width: 400; height: 300 
    Text { text: "Vendor"; } 
    Text { 
     x: 200 
     text: "Product"; } 
    ComboBox { 
     id: box2 
     objectName: "productBox" 
     x:200; y:25; width: 180 
     model: model2 
     textRole: "display" 
    } 

    ComboBox { 
     y:25; width: 180 
     id: box1 
     model: model1 
     textRole: "display" 
     onCurrentTextChanged: { 
      generator.generate(currentText) 
     } 
    } 

} 

Все комментарии высоко ценятся.

ответ

0

Элемент ComboBox не реагирует на изменения, выполненные под капотом, к модели.

Существует несколько решений, позволяющих обойти его.

Возможный один переназначить модель себе в конце обработчика сигнала, с помощью оператора:

model = model; 

Как от documentation:

Изменение модели после инициализации сбросит currentIndex на 0.

В противном случае вы можете указать currentIndex по вашей любимой цене e или, что еще лучше, до -1.
В самом деле, из documentation имеет:

Установка currentIndex на -1 сбросит выделение и очистить текстовую метку.

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