c++ - 如何强制多个 View 显示同一模型行

标签 c++ qt

我有多个共享同一模型的 QCombobox。通常他们可以独立选择该模型中的项目。 在某些情况下,我希望强制这些组合框显示相同的模型行,即当一个人更改选择时,应该在其他组合中反射(reflect)出来。

这可以通过(可能困惑的)信号和槽来完成,但我想知道是否有一种方法可以从模型端更干净地完成它。 IE。强制所有 View 显示同一行。

下面的评论指出在组合之间共享选择模型。我通过将组合收集到列表中并为其设置模型来完成此操作:

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::listemplace_back 一起使用。由ValueGuy 签名。

关于c++ - 如何强制多个 View 显示同一模型行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39247471/

相关文章:

python - 检查 QColorDialog 是否被取消

c++ - 将焦点设置到第一个小部件

c++ - std::thread 并在 visual studio 2013 中 move

C++ 绑定(bind)成员函数(回调)

c++ - 将 RegQueryValueEx 用于可能为 REG_DWORD 或 REG_SZ 的注册表值

c++ - 在Qt主窗口右下角放置弹出窗口

c++ - QT QWebEnginePage::setWebChannel() 传输对象

c++ - 如何在 Mac OS X 上枚举卷?

c++ - QTreeView Item Hover/根据当前颜色选择背景色

C++ 模板 : Pass Type, 不是实例?