如何更新QTreeWidget中的多个选定行的窗口小部件?

时间:2019-04-10 17:05:30

标签: qt treeview multipleselection

我想更新QTreeWidget中选定行中第一列中的所有复选框。

例如,假设我使用Selection ModeQAbstractItemView::ExtendedSelection在QTreeView中选择了项目2和项目3。

| Name   | Visible        |
|--------|----------------|
| Item 1 | [x] Checkbox 1 |
| Item 2 | [ ] Checkbox 2 |
| Item 3 | [ ] Checkbox 3 |

然后,当我单击复选框2时,我希望同时启用复选框2和复选框3,并且选择不应更改。

但是我所需要的是选中复选框2,并且选择内容仅更新为currentItem(项目2)。复选框3保持不变。

我使用Qt 5.12在Windows 7和Visual Studio 2015上工作。

tree.h

/** Update selected items list */
void updateSelectedItemsList() { m_selectedItemsList = selectedItems(); };

/** Update selected items
 * Updates multiple selected items when contents of the \p column in the specified \p item changes
 * \param item current modified item
 * \param column where something changed
 */
void updateSelectedItems( bool state );

tree.cpp

connect( this, SIGNAL( itemSelectionChanged() ), this, SLOT( updateSelectedItemsList() ) );
connect( m_visibleCheckBox, SIGNAL( toggled( bool ) ),this->getParent(), SLOT( updateSelectedItems(bool) ) );

...

void ConfigureSignalsTree::updateSelectedItems( bool state )
{
   for ( auto item : m_selectedItemsList )
   {
        ConfigureSignalsTreeItem* treeItem = dynamic_cast<ConfigureSignalsTreeItem*>(item);
        if ( treeItem )
        {
            treeItem->m_visibleCheckBox->setChecked( state );
        }
    }
}

问题:单击复选框后,m_selectedItemsList始终包含currentItem。

从我所做的测试中我了解了什么

当我单击一个复选框时,信号将发送到:

  1. 更新TreeView中的选定项目,将先前的selectedItems更改为currentItem
  2. 更新复选框状态

我想避免选择更新,但我不知道该如何捕捉。

也许我应该使用QItemSelection Class,但是我没有模型/视图编程结构,所以我不知道是否需要更改所有体系结构才能使用它。

0 个答案:

没有答案