2010-01-11 2 views
1

У меня есть QTreeWidget с элементами в нем. Первый столбец содержит уникальный номер. Это устанавливается через item-> setData (0, 0, unique_number) ;. Второй столбец содержит флажок, установленный через item-> setCheckState (1, Qt :: Unchecked) ;. Пользователь может выбрать элементы (ы), с которыми он хотел бы работать, и нажимать кнопку. Слот для этой кнопки будет запускать цикл для отмеченных элементов. В документации Qt приведен пример. Вы используете QTreeWidgetItemIterator.Qt 4.6 - C++ - Итератор QTreeWidgetItem

QTreeWidgetItemIterator it(treeWidget); 
while (*it) { 
    if ((*it)->text(0) == itemText) 
     (*it)->setSelected(true); 
    ++it; 
} 

В нем также говорится, что вы можете указать аргумент в конструкторе, чтобы перебирать только проверенные элементы. Флаг: QTreeWidgetItemIterator :: Checked. Мой слегка настроенный контур выглядит следующим образом:

QTreeWidgetItemIterator it(treeWidget, QTreeWidgetItemIterator::Checked); 

while (*it) 
{ 
    QVariant w; 
    w = (*it)->data(0, 0); 
    std::cout << "Selected item # " << w.toInt() << "\n"; 
    it++; 

} 

Этот код будет компилироваться в порядке, но не будет работать, когда вы фактически запустите программу. Он не печатает никаких значений.

Любые советы? Благодаря!

ответ

1

Описанная в документации Qt оговорка заключается в том, что флаг QTreeWidgetItemIterator :: Checked проверяет состояние проверки для столбца 0 в каждой из ваших QTreeWidgetItems. Использование столбца 0 для вашего флажка и столбца 1 для вашего уникального номера должно заставлять цикл печатать значения.

1

Спасибо Roneel!

Другой способ сделать это так (я только что понял).

QTreeWidgetItemIterator it(ui->treeWidget); 

while (*it) 
{ 

    if ((*it)->checkState(1) == 2) 
    { 
     QVariant w; 
     w = (*it)->data(4, 0); 
     std::cout << "Selected item # " << w.toString().toStdString() << "\n"; 
    } 

    ++it; 

} 

checkState принимает аргумент столбца int, а функция == 2 позволяет обрабатывать только проверенные элементы.

1

Только одно: я думаю, что это не очень хорошая привычка сравнивать enum с int, поскольку enum «int value» может измениться ... вместо этого сравнить с Qt::Checked ... Это просто «наверняка» и многое другое чистый для чтения