Russian Qt Forum

Qt => Вопросы новичков => Тема начата: sektor от Июль 25, 2016, 11:51



Название: Фильтрация повторяющихся значений
Отправлено: sektor от Июль 25, 2016, 11:51
Добрый день. Есть модель QAbstractTableModel. Колонки модели вывожу в combobox. Теперь мне нужно, чтобы combobox не отображал повторяющие строки в столбце. Как это можно сделать ?


Название: Re: Фильтрация повторяющихся значений
Отправлено: Bepec от Июль 25, 2016, 12:00
Удалить повторяющиеся данные из модели?


Название: Re: Фильтрация повторяющихся значений
Отправлено: gil9red от Июль 25, 2016, 12:11
Поместить список колонок в множество QSet (http://doc.qt.io/qt-4.8/qset.html), множество не может содержать дубликаты.
Еще, комбобокс по-умолчанию не показывает дубликаты (http://doc.qt.io/qt-4.8/qcombobox.html#duplicatesEnabled-prop), правда там есть исключение, которые вы, наверное, нарушили


Название: Re: Фильтрация повторяющихся значений
Отправлено: sektor от Июль 25, 2016, 15:10
Цитировать
Удалить повторяющиеся данные из модели?
Нет мне нужно просто отобразить без повторений.

Цитировать
Поместить список колонок в множество QSet, множество не может содержать дубликаты.
Еще, комбобокс по-умолчанию не показывает дубликаты, правда там есть исключение, которые вы, наверное, нарушили
У меня duplicatesEnabled() в состоянии false. Я не знаю почему он отображает.

вот кусок кода
Код:
DialogAbb::DialogAbb(QSqlRelationalTableModel* model, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DialogAbb)
{

    ui->setupUi(this);
    //model->submit();


    ui->name_2->setModel(model); //модель примерно такая "SELECT RecordID, DisplayText FROM MyCatalog;"
    ui->name_2->setModelColumn(1); // Колонка для отображения текста

Может как то с помощью прокси модели надо делать qsortfilterproxymodel ?


Название: Re: Фильтрация повторяющихся значений
Отправлено: kai666_73 от Июль 25, 2016, 16:42
Вангую дублирование данных в MyCatalog, то есть что-то вроде

RecordID      DisplayText
1                 Управление связи
2                 Управление связи


Название: Re: Фильтрация повторяющихся значений
Отправлено: Bepec от Июль 25, 2016, 17:58
Конечно. Ведь ему он устанавливает модель.
А duplicatesEnabled не позволяет добавлять пользователю дублирующиеся строки. Но не мешает их добавлять программно.

По сути вам надо отдавать в QComboBox недублированный список. А т.к. у вас каждая запись имеет индекс п/п, то каждая запись уникальна.

PS берёте руки в ноги, пишете функцию удаления дубликатов и вставляете в QComboBox. А то ишь чего захотели :D


Название: Re: Фильтрация повторяющихся значений
Отправлено: kai666_73 от Июль 25, 2016, 21:32
Мелко плаваете Верес )
Тут скорее проблема с проектированием БД - ТС-у же скорее всего и RecordId из модели понадобится...


Название: Re: Фильтрация повторяющихся значений
Отправлено: sektor от Июль 25, 2016, 21:35
Цитировать
По сути вам надо отдавать в QComboBox недублированный список. А т.к. у вас каждая запись имеет индекс п/п, то каждая запись уникальна.

PS берёте руки в ноги, пишете функцию удаления дубликатов и вставляете в QComboBox. А то ишь чего захотели Веселый

А, нельзя создать промежуточную модель, удалить дублирующие строки, и промежуточную модель передать в combobox?
Если кончено можно это сделать с помощью сортировки.


Название: Re: Фильтрация повторяющихся значений
Отправлено: sektor от Июль 25, 2016, 21:37
Цитировать
Мелко плаваете Верес )
Тут скорее проблема с проектированием БД - ТС-у же скорее всего и RecordId из модели понадобится...
И какую проблему ты видишь ?


Название: Re: Фильтрация повторяющихся значений
Отправлено: Bepec от Июль 25, 2016, 23:34
Какая разница что делать. Ему всё равно придётся этот список выдирать откуда то. Толи из базы, пусть и плохо, но спроектированной, пусть из модели, пусть из прокси модели.
Так мб проще захреначить sql запрос, в нём дули удалить нафиг и запихать в комбобокс? Так будет проще и спокойнее всем, и бд останется стоять и модель не понадобится.


Название: Re: Фильтрация повторяющихся значений
Отправлено: kai666_73 от Июль 25, 2016, 23:51
Цитировать
Мелко плаваете Верес )
Тут скорее проблема с проектированием БД - ТС-у же скорее всего и RecordId из модели понадобится...
И какую проблему ты видишь ?

Мы с Вересом может и переругиваемся, но все-таки на вы )
Проблема, собственно, в том что
1. Таблица(ы) не нормализована(ы)
2. Вытекает из первой, подробнее:
  вот заполните вы все поля в диалоге, сделаете сабмит, далее вам надо что-то в базу записать; по хорошему это должен быть ID, а не текстовое поле, но из приведенного мною примера это 1 или 2?


Название: Re: Фильтрация повторяющихся значений
Отправлено: Bepec от Июль 26, 2016, 00:04
Тут сначала надо понять, что важнее. Быстро сделать, или привести всё в порядок. Можно ли трогать бд, или нельзя (мб там ещё десяток приложений пользует, все переписывать эт заппц). Или сделать переходный вариант в виде связанной новой таблицы, правильно спроектированной :)

PS вон работает http сервер на делфи, под ватчером на Qt, дырки в котором затыкаются при помощи инжекта dll и перезаписи памяти процесса, перезапускается раз в 2 дня. (каюсь, ватчер делал я) Но чтоб это привести всё в порядок, нужно минимум месяца 4 и бюджет. А можно ватчер написать за день и оно будет пыхтеть :D


Название: Re: Фильтрация повторяющихся значений
Отправлено: kai666_73 от Июль 26, 2016, 00:26
Безусловно, контекст важен...

Тут, скорее, было спрошено - было отвечено )


Название: Re: Фильтрация повторяющихся значений
Отправлено: sektor от Июль 26, 2016, 07:19
Цитировать
Мы с Вересом может и переругиваемся, но все-таки на вы )
Проблема, собственно, в том что
1. Таблица(ы) не нормализована(ы)
2. Вытекает из первой, подробнее:
  вот заполните вы все поля в диалоге, сделаете сабмит, далее вам надо что-то в базу записать; по хорошему это должен быть ID, а не текстовое поле, но из приведенного мною примера это 1 или 2?

Да, извините погорячился.

Запись в БД уже реализована. Все поля в диалоговом окне записываются в БД. БД настроена так, что ключ ID  строки БД присваивает автоматом. БД у меня реляционная. Я хотел пользователю ПО предоставить удобство ввода. Если в колонке уже вводилось значение, чтобы в combobox эти значения отображались. Но проблема в дубликатах. 


Название: Re: Фильтрация повторяющихся значений
Отправлено: sektor от Июль 26, 2016, 07:22
Цитировать
Тут сначала надо понять, что важнее. Быстро сделать, или привести всё в порядок. Можно ли трогать бд, или нельзя (мб там ещё десяток приложений пользует, все переписывать эт заппц). Или сделать переходный вариант в виде связанной новой таблицы, правильно спроектированной Улыбающийся

PS вон работает http сервер на делфи, под ватчером на Qt, дырки в котором затыкаются при помощи инжекта dll и перезаписи памяти процесса, перезапускается раз в 2 дня. (каюсь, ватчер делал я) Но чтоб это привести всё в порядок, нужно минимум месяца 4 и бюджет. А можно ватчер написать за день и оно будет пыхтеть Веселый

подскажите как правильнее будет, все проектируется с нуля я могу изменить все и БД тоже.  Важнее, чтобы перевести все в порядок.


Название: Re: Фильтрация повторяющихся значений
Отправлено: Bepec от Июль 26, 2016, 10:15
Ну тогда у вас проблема в добавлении значений в таблицу. Вообще по идее надо поставить флаг уникальности на текстовое поле. Вам же не нужна таблица заполненная дубликатами.
Ну и тогда ваша проблема, приведённая в этой теме просто исчезнет.

PS без точного знания тз что-то приводить в порядок невозможно. А тут уже накладывается лень и нежелание забивать левой инфой мозг :D


Название: Re: Фильтрация повторяющихся значений
Отправлено: sektor от Июль 26, 2016, 11:37
Цитировать
Ну тогда у вас проблема в добавлении значений в таблицу. Вообще по идее надо поставить флаг уникальности на текстовое поле. Вам же не нужна таблица заполненная дубликатами.
Ну и тогда ваша проблема, приведённая в этой теме просто исчезнет.

PS без точного знания тз что-то приводить в порядок невозможно. А тут уже накладывается лень и нежелание забивать левой инфой мозг 

Опять не правильно поняли. У меня в таблице будут дубликаты например: как на скрине "управление связи". Она в таблице может 1000 раз повторятся. А в combobox e я хочу его видеть 1 раз.

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


Название: Re: Фильтрация повторяющихся значений
Отправлено: kai666_73 от Июль 26, 2016, 12:28
Цитировать
Ну тогда у вас проблема в добавлении значений в таблицу. Вообще по идее надо поставить флаг уникальности на текстовое поле. Вам же не нужна таблица заполненная дубликатами.
Ну и тогда ваша проблема, приведённая в этой теме просто исчезнет.

PS без точного знания тз что-то приводить в порядок невозможно. А тут уже накладывается лень и нежелание забивать левой инфой мозг 

Опять не правильно поняли. У меня в таблице будут дубликаты например: как на скрине "управление связи". Она в таблице может 1000 раз повторятся. А в combobox e я хочу его видеть 1 раз.

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

Да нет же, это вы не правильно поняли. Вам нужна дополнительная таблица-справочник, типа
MyDepartaments
DEPT_ID   DESCR
1             Управление связи
2             Логистика
.......

А в таблицу MyCatalog необходимо поместить колонку DEPT_ID вместо DisplayText (так называемый внешний ключ на DEPT_ID из MyDepartaments).
Соответственно, модель для комбо брать из MyDepartaments. Если пользователь ввел новое значение в комбо, то помимо прочих действий при сабмите диалога необходимо будет добавлять новую запись в MyDepartaments.

Ну, по крайней мере, я бы выбрал именно такую реализацию.


Название: Re: Фильтрация повторяющихся значений
Отправлено: Bepec от Июль 26, 2016, 14:16
Бредово.
ТС вы хотите уникальности значения, в неуникальной таблице с возможностью добавления неуникальных значений. Вы уж, ей богу, определитесь что за фигня у вас там в базе творится.

PS уже давно б сделали список уникальных значений из sql запроса и засунули в комбобокс. Ан нет, чуда ждут.


Название: Re: Фильтрация повторяющихся значений
Отправлено: sektor от Июль 26, 2016, 16:39
Цитировать
Да нет же, это вы не правильно поняли. Вам нужна дополнительная таблица-справочник, типа
MyDepartaments
DEPT_ID   DESCR
1             Управление связи
2             Логистика
.......

А в таблицу MyCatalog необходимо поместить колонку DEPT_ID вместо DisplayText (так называемый внешний ключ на DEPT_ID из MyDepartaments).
Соответственно, модель для комбо брать из MyDepartaments. Если пользователь ввел новое значение в комбо, то помимо прочих действий при сабмите диалога необходимо будет добавлять новую запись в MyDepartaments.
Да делал я так тоже. Ладно буду разбираться спасибо всем.

Цитировать
PS уже давно б сделали список уникальных значений из sql запроса и засунули в комбобокс. Ан нет, чуда ждут.
Да... точно пора уже действовать