C ++ / QML交互式组合框实现

时间:2016-01-15 13:31:57

标签: c++ combobox qml

我有两个组合框,第二个的数据由第一个组成。第二个组合框中的字符串数量从2到4不等。如果I:

  1. 在第一个组合框中选择一个新字符串,然后
  2. 选择了最后一个选项     在第二个组合框中,列表长于上一个列表     那个盒子,
  3. 第二个组合框中的currentString保留并覆盖正确的文本

    例如,如果我在第一个组合框中选择Scubapro(第二个框中有4个选项),在第二个组合框中选择Smart(第四个选项),则再次在第一个组合框中选择任何其他选项(< 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)
            }
        }
    
    }
    

    任何评论都非常感谢。

1 个答案:

答案 0 :(得分:0)

ComboBox项不会对模型引擎盖下的更改做出反应。

有几种解决方案可以解决它。

可能的一种方法是使用以下语句将模型重新分配给信号处理程序的末尾:

model = model;

来自documentation

  

初始化后更改模型会将currentIndex重置为0.

否则,您可以明确将currentIndex设置为首选值,或者更好地设置为-1
事实上,从documentation我们得到了:

  

将currentIndex设置为-1将重置选择并清除文本标签。