如何强制多个视图显示相同的模型行

时间:2016-08-31 10:44:29

标签: c++ qt

我有多个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);
  }

我在这里错过了一步吗?

2 个答案:

答案 0 :(得分:3)

选择是红鲱鱼。 QComboBox不允许选择多个项目。您所指的是&#34;选择&#34;是当前的指数。通过将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::listemplace_back一起使用。由ValueGuy签名。

答案 1 :(得分:2)

检查http://doc.qt.io/qt-5/qitemselectionmodel.htmlhttp://doc.qt.io/qt-5/model-view-programming.html#handling-selections-of-items

通常每个视图都有自己的选择模型,但是您可以让一个视图使用另一个视图的选择模型。

编辑:似乎view的{​​{1}}仅适用于选择弹出窗口。您还可以将选择模型的selectionChanged / currentRowChanged信号连接到每个“setCurrentIndex”。

或者你可以让你的父类连接到组合框的每个信号,然后在父类的信号处理程序中调用每个组合框的插槽。