我有两个组合框,第二个的数据由第一个组成。第二个组合框中的字符串数量从2到4不等。如果I:
第二个组合框中的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)
}
}
}
任何评论都非常感谢。
答案 0 :(得分:0)
ComboBox
项不会对模型引擎盖下的更改做出反应。
有几种解决方案可以解决它。
可能的一种方法是使用以下语句将模型重新分配给信号处理程序的末尾:
model = model;
初始化后更改模型会将currentIndex重置为0.
否则,您可以明确将currentIndex
设置为首选值,或者更好地设置为-1
。
事实上,从documentation我们得到了:
将currentIndex设置为-1将重置选择并清除文本标签。