我有多个共享同一模型的QCombobox。通常,他们可以独立选择该模型中的项目。在某些情况下,我希望强制这些组合框显示相同的模型行,即,当一个选择更改时,应在其他组合中反映出来。
这可以通过(可能是)信号和插槽来完成,但是我想知道是否有一种方法可以从模型端更加干净地进行。即强制所有视图显示同一行。
下面的注释指向在组合中共享selectionModel。我通过将我的组合收集到列表中并在其上设置模型来完成此操作:
QList<QComboBox*> my_combos;
// .. then populate my_combos .. then
QComboBox *combo;
foreach(combo, my_combos)
combo->setModel(&_my_model);
然后
QItemSelectionModel *selectionmodel = my_combos.at(0)->view()->selectionModel();
foreach(combo, my_combos)
{
if (combo == my_combos.at(0))
continue;
combo->view()->setSelectionModel(selectionmodel);
}
我在这里错过了一步吗?
该选择是红色鲱鱼。QComboBox
不允许选择多个项目。您所说的“选择”是当前索引。通过将currentIndexChanged
信号连接到,可以轻松地在组合框之间共享它setCurrentIndex
:
// https://github.com/KubaO/stackoverflown/tree/master/questions/combo-shared-select-39247471
#include <QtWidgets>
#include <array>
int main(int argc, char ** argv) {
QApplication app{argc, argv};
QStringListModel model;
model.setStringList({ "foo", "bar", "baz "});
QWidget ui;
QHBoxLayout layout{&ui};
std::array<QComboBox, 3> combos;
// setIndices could be a method in a class
auto setIndices = [&combos](int index) {
for (auto & combo : combos)
combo.setCurrentIndex(index);
};
for (auto & combo : combos) {
using namespace std::placeholders;
layout.addWidget(&combo);
combo.setModel(&model);
QObject::connect(&combo,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
setIndices);
}
ui.show();
return app.exec();
}
旁注:您可以按值保存小部件。如果它们的数目在编译时是固定的,请使用std::array
。否则,你可以使用std::list
同emplace_back
。由ValueGuy签名。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句