У меня есть две поля со списком, данные для второго определяются тем, что у первого. Количество строк во втором поле со списком колеблется от 2 до 4. Если я:Внедрение интерактивного комбинированного блока C++/QML
- выбрать новую строку в первом поле и
- последний выбор выбран во втором поле со списком с длинный список, чем предыдущий список , что коробка,
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)
}
}
}
Все комментарии высоко ценятся.