2015-07-01 4 views
0

Я добавляю элементы флажка в список.Элемент QListView с положением выбора флажка

Затем, когда я меняю индикатор флажка, строка позиции не выбрана. И когда я выбираю элемент в списке, индикатор флажка не изменится.

Индикатор флажка должен быть выбран/отменен в строке выбора позиции, а выбор индикатора флажка должен установить выбранную строку позиции.

Просмотр списка инициализации:

QListView *poListView = new QListView(this); 

// Create list view item model 
QStandardItemModel* poModel = 
      new QStandardItemModel(poListView); 

QStandardItem *poListItem = new QStandardItem; 

// Checkable item 
poListItem->setCheckable(true); 

// Uncheck the item 
poListItem->setCheckState(Qt::Unchecked); 

// Save checke state 
poListItem->setData(Qt::Unchecked, Qt::CheckStateRole); 

poModel->setItem(0, poListItem); 

poListView->setModel(poModel); 

Любое предложение?

ответ

0

Вы должны соединить itemChanged сигнал QStandardItemModel и выбрать там элементы вручную.

Если вы хотите, чтобы флажок был установлен при выборе, вам также необходимо будет подключить selectionChanged сигнал QListView::selectionModel() и проверить/снять отметку с него.

Кроме того, вам не нужно вручную устанавливать Qt::CheckStageRole.

Использование C++ 11 и лямбды, которые будут выглядеть следующим образом:

connect(poModel, &QStandardItemModel::itemChanged, [poListView, poModel](QStandardItem * item) { 
    const QModelIndex index = poModel->indexFromItem(item); 
    QItemSelectionModel *selModel = poListView->selectionModel(); 
    selModel->select(QItemSelection(index, index), item->checkState() == Qt::Checked ? QItemSelectionModel::Select : QItemSelectionModel::Deselect); 
}); 

connect(poListView->selectionModel(), &QItemSelectionModel::selectionChanged, [poModel](const QItemSelection &selected, const QItemSelection &deselected) { 
    for (const QModelIndex &index : selected.indexes()) { 
     poModel->itemFromIndex(index)->setCheckState(Qt::Checked); 
    } 
    for (const QModelIndex &index : deselected.indexes()) { 
     poModel->itemFromIndex(index)->setCheckState(Qt::Unchecked); 
    } 
}); 

Или со старым connect синтаксисом:

void MyClass::handleCheckedChanged(QStandardItem *item) { 
    const QModelIndex index = item->model()->indexFromItem(item); 
    QItemSelectionModel *selModel = poListView->selectionModel(); 
    selModel->select(QItemSelection(index, index), item->checkState() == Qt::Checked ? QItemSelectionModel::Select : QItemSelectionModel::Deselect); 
} 

void MyClass::handleSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected) { 
    foreach (const QModelIndex &index, selected.indexes()) { 
     index.model()->itemFromIndex(index)->setCheckState(Qt::Checked); 
    } 
    foreach (const QModelIndex &index, deselected.indexes()) { 
     index.model()->itemFromIndex(index)->setCheckState(Qt::Unchecked); 
    } 
} 

... 

connect(poModel, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(handleCheckedChanged(QStandardItem *))); 

connect(poListView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(handleSelectionChanged(QItemSelection, QItemSelection))); 
0

решенный этот вопрос путем соединения двух сигналов

  1. Зарегистрированный элемент модели изменил сигнал для обработки изменения индикатора флажка.
  2. Registered вид элемент активируется сигнал для изменения состояния индикатора Флажок

Вот мой код:

void MyClass:Init() 
{ 
    m_poListView = new QListView(this); 

    // Set single selection mode 
    m_poListView->setSelectionMode(
       QAbstractItemView::SingleSelection); 

    // Create list view item model 
    QStandardItemModel* poModel = 
       new QStandardItemModel(m_poListView); 

    QStandardItem * poListItem = 
       new QStandardItem; 

    // Checkable item 
    poListItem->setCheckable(true); 

    // Save checke state 
    poListItem->setData(Qt::Unchecked, Qt::CheckStateRole); 

    poModel->setItem(0, poListItem); 

    m_poListView->setModel(poModel); 

    // Register model item changed signal 
     connect(poModel, SIGNAL(itemChanged(QStandardItem*)), 
     this,   SLOT (SlotItemChanged(QStandardItem*))); 

    // Resister view item acticated 
    connect(m_poListView , SIGNAL(activated(const QModelIndex &)), 
       this,  SLOT(SlotListItemActivated(const QModelIndex &))) 

} 

Слоты implemntation:

void MyClass::SlotItemChanged(QStandardItem *poItem) 
{ 
    // Get current index from item 
    const QModelIndex oCurrentIndex = 
      poItemChanged->model()->indexFromItem(poItem); 

    // Get list selection model 
    QItemSelectionModel *poSelModel = 
      m_poListView->selectionModel(); 

    // Set selection 
    poSelModel->select(
       QItemSelection(oCurrentIndex, oCurrentIndex), 
       QItemSelectionModel::Select | QItemSelectionModel::Current); 
} 

void MyClass::SlotListItemActivated(const QModelIndex &oIndex) 
{ 
    Qt::CheckState eCheckState = Qt::Unchecked; 

    // Get item's check state 
    bool bChecked = 
      oIndex.data(Qt::CheckStateRole).toBool(); 

    // Item checked ? 
    if (bChecked == false) 
     eCheckState = Qt::Checked; 
    else 
     eCheckState = Qt::Unchecked; 

    // Get index model 
     // Note: I used QSortFilterProxyModel in the original code 
    QSortFilterProxyModel *poModel = 
     (QSortFilterProxyModel *)oIndex.model(); 

    // Update model data 
    poModel->setData(oIndex, eCheckState, Qt::CheckStateRole); 
} 
Смежные вопросы