【问题标题】:C++ / QML interactive combo box implementationC++/QML 交互式组合框实现
【发布时间】:2016-01-15 13:31:56
【问题描述】:

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

  1. 在第一个组合框中选择一个新字符串并
  2. 最后一个选项被选中 在第二个组合框中,其列表比前一个列表长 那个盒子,

第二个组合框中的 currentString 保留并覆盖正确的文本

例如,如果我在第一个组合框中选择 Scubapro(第二个框中有 4 个选项),在第二个组合框中选择 Smart(第四个选项),然后再次在第一个组合框中选择任何其他选项(

#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)
        }
    }

}

任何cmets都非常感谢。

【问题讨论】:

    标签: c++ combobox qml


    【解决方案1】:

    ComboBox 项目不会对在后台对模型执行的更改做出反应。

    有几个解决方案可以解决这个问题。

    一种可能的方法是在信号处理程序结束时将模型重新分配给自身,方法是使用以下语句:

    model = model;
    

    来自documentation

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多