Russian Qt Forum
Сентябрь 30, 2024, 18:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отметить дубликаты в столбце TableWidget  (Прочитано 4354 раз)
crocus
Гость
« : Декабрь 03, 2006, 10:47 »

Есть необходимость отметить дубликаты в столбце TableWidget, предполагаю - нужно выбрать все значения столбца в QStringList, затем с помощью std::unique перенести неуникальные в новый список - затем уже в новом оставить только уникальные и в конце сравнить со столбцом TableWidget - выделить дубликаты.
Но не знаю как использовать std::unique в Qt. По возможности подкиньте пример использования std в Qt и/или есть более простой/готовый алгоритм поиска дубликатов в Qt.
Записан
bigirbis
Гость
« Ответ #1 : Декабрь 03, 2006, 11:03 »

Есть более логичный вариант. В свое время реализовывал.
Можно написать шаблон для QAbstractItemModel и передать ему в качестве аргумента твою модель. Еще надо реализовать итераторы. В базовом варианте займет где-то пол-дня, но на будущее очень даже пригодится.
Записан
Tonal
Гость
« Ответ #2 : Декабрь 03, 2006, 12:52 »

std::unique предполагает что неуникальные значения идут подряд.
Например последовательность отсортированная.
Если это не так, то проще отфильтровать руками:
Вот псевдокод:
Код:

std::set<Тип_из_столбца> Набор;
Для каждой строки:
  Если значения_из_столбца нет в Наборе:
    добавляем  значения_из_столбца нет в Набор
  Иначе:
    Строка - дубль!

Можно сделать простейшего наследника от QSortFilterProxyModel и засунуть в него немудрящую эту логику.  ;-)
Записан
crocus
Гость
« Ответ #3 : Декабрь 06, 2006, 04:59 »

Ну вот получилось как-то так:
Код:
void NewspaperWindow::findDuplicates()
{
int col_cleaner = listTable->currentColumn();
QStringList uniquel;
for ( int j = 0; j < listTable->rowCount(); ++j )
{
QString m_colcleaner = listTable->item(j, col_cleaner)->text();
QTableWidgetItem * item = listTable->item( j, col_cleaner );
if (!uniquel.contains(m_colcleaner)){
uniquel << m_colcleaner;
} else {
QList<QTableWidgetItem *> finding = listTable->findItems( m_colcleaner, Qt::MatchContains);
foreach (item, finding)
{
item->setBackgroundColor(Qt::red);
}
}
}
}

Правда на скоряк недодумал как выделять строки, а не только ячейки.
Может кто подшлифует код - буду признателен!!
Записан
bigirbis
Гость
« Ответ #4 : Декабрь 06, 2006, 12:02 »

Интересно, как это будет работать при большом количестве строк?
Записан
crocus
Гость
« Ответ #5 : Декабрь 06, 2006, 12:06 »

то bigirbis:
Возьми да проверь!!

Я проверил на таблице из 3284 строк - сравним результаты???
Записан
bigirbis
Гость
« Ответ #6 : Декабрь 06, 2006, 12:31 »

Вопрос по какому принципу строка определяется как уникальная. Судя по алгоритму, первая встреча такой строки считается уникальной, а все остальные нет. В таких случаях, думаю, все такие строки должны быть отмечены как дубликатные. Это становится актуально при наличии нескольких столбцов!!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 20.