Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/37: Рейтинг темы: голосов - 37, средняя оценка - 4.62
459 / 357 / 69
Регистрация: 29.05.2018
Сообщений: 1,052
1

QStringListModel, setData() и data()

29.01.2022, 07:09. Показов 7521. Ответов 117
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе утро!

Пытаюсь следующим образом добавить к модели QStringListModel дополнительные данные в Qt::UserRole + 1:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
QStringList list1 = {"abcde", "fghij", "klmno", "abcde2", "fghij2", "klmno2"};
    QStringList list2 = {"ABCDE", "FGHIJ", "KLMNO", "ABCDE2", "FGHIJ2", "KLMNO2"};
 
    QStringListModel* model_1 = new QStringListModel();
    QStringListModel* model_2 = new QStringListModel();
 
    model_1->setStringList(list1);
    model_2->setStringList(list2);
 
    for(int row = 0; row < list1.size(); row++)
    {
        model_1->setData(model_1->index(row), row, Qt::UserRole + 1);
        model_2->setData(model_2->index(row), row, Qt::UserRole + 1);
    }
 
    for(int row = 0; row < list1.size(); row++)
    {
        qDebug() << model_1->data(model_1->index(row), Qt::UserRole + 1).toInt();
    }
В выхлопе qDebug вместо ожидаемых 0...5 имею все нули. Что не так?

P.S. Конечная цель этих мероприятий - настроить параллельную фильтрацию записей в двух списках, где записи имеют одни и те же индексы (см. скрин).
Миниатюры
QStringListModel, setData() и data()  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2022, 07:09
Ответы с готовыми решениями:

QStringListModel Не получается создать виджет не из main функции
Доброго времени суток %username%. Столкнулся с такой проблемой. Вот есть кусочек кода: QWidget...

QGraphicsItem и setData
Возникла необходимость каждой картинке (QGraphicsItem) присвоить свой тип, в дальнейшем потом...

SetData() после insertColumn
создаю колонку и в ней пишу данные, вектор меняется, а модель нет. что нужно поправить ? bool...

TableView->model->setData() не работает
Здравствуйте! Не могу понять в чем проблема. В коде ниже я забираю данные из таблицы (таблица...

Реализация метода SetData интерфейса IDataObject
Всем привет, мне необходимо написать реализацию для этого метода в таком виде: private void...

117
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
29.01.2022, 07:28 2
Цитата Сообщение от Ender Che Посмотреть сообщение
Конечная цель этих мероприятий - настроить параллельную фильтрацию записей в двух списках, где записи имеют одни и те же индексы (см. скрин).
О каких индексах речь? Просто индексы или QModelIndex? У меня мнение, что вы что-то не то делаете и не так используете инструменты. Для фильтрации есть класс QFilterProxyModel, для одновременной выборки из двух View класс QItemSelectionModel. Можете более точно и подробно рассказать вашу задачу и конечную цель, что нужно получить в итоге?
0
459 / 357 / 69
Регистрация: 29.05.2018
Сообщений: 1,052
29.01.2022, 11:02  [ТС] 3
Цитата Сообщение от insite2012 Посмотреть сообщение
Можете более точно и подробно рассказать вашу задачу и конечную цель, что нужно получить в итоге?
В конечном итоге хотелось бы получить минисловарь с двумя QStringListView (слова и переводы) и QLineEdit над ними для ввода слов. При вводе в любой QLineEdit слова должны отфильтровываться в QStringListView (да, с помощью QSortFilterProxyModel, до этого я дотумкал), при этом в QStringListView должны отфильтровываться переводы в параллель вводимому слову. Предполагаю использовать в базе данных словаря таблицу для хранения вида "индекс" - "слово" - "перевод", для чего и затеялся эти индексы впихнуть в модель.
0
1072 / 678 / 182
Регистрация: 30.03.2021
Сообщений: 2,120
29.01.2022, 15:28 4
Ender Che, накидал простенький пример словаря

кучка букв
Кликните здесь для просмотра всего текста

Очень возможно, что это говнокод и я снова нуб и опозорился , сам только вникаю в MVC поэтому это просто моя первае попытка использовать QSortFilterProxyModel.
Опираясь на вышесказанное
-сделал пару списков, в первом англ. слово, во втором перевод, и загнал их в QMap
(сразу же ограничения: оба списка должны быть одинаковой длинны, и англ. слову сопоставлено лишь одно слово перевода, хотя можно было бы сопоставлять со списком слов, но я не стал усложнять код... И вот этот момент вызывает сомнения, т.к. если слов будет тысячь десять, причем порядок английских в списке не будет совпадать с русскими-то вручную всё это устаканить будет очень непросто, поэтому я даже не представляю, как это реализовать... Видимо искать базы словарей и отталкиваться от их внутренней организации для построения данных модели.)

-сделал пару QStringListModel, что бы удобно сразу загнать туда списки, а не с помощью setData в QSortFilterProxyModel
-сделал референсы на модели списков в QSortFilterProxyModel
-при клике на строку в списке англ. слов, или вводе текста в поле ввода - ищем в словаре сопоставленный перевод и фильтруем регуляркой модель списка перевода

Вот как-то-так...


код:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "mainwindow.h"
#include <QStringList>
#include <QStringListModel>
#include <QListView>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QSortFilterProxyModel>
#include <QLineEdit>
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
 
QStringList list1, list2;
list1<<"one"<<"two"<<"three"<<"four"<<"five";
list2<<"один"<<"два"<<"три"<<"четыре"<<"пять";
 
QMap<QString, QString> dict;
if(list1.length()==list2.length()){
    for(int index=0; index<list1.length(); ++index){
        dict.insert(list1.at(index), list2.at(index));
    }
}
 
QListView *listView1=new QListView,
          *listView2=new QListView;
 
QStringListModel *listModel1=new QStringListModel,
                 *listModel2=new QStringListModel;
 
QSortFilterProxyModel *sortedModel1=new QSortFilterProxyModel;
sortedModel1->setSourceModel(listModel1);
 
QSortFilterProxyModel *sortedModel2=new QSortFilterProxyModel;
sortedModel2->setSourceModel(listModel2);
sortedModel2->setFilterRegExp(" ");
 
listModel1->setStringList(list1);
listModel2->setStringList(list2);
 
listView1->setModel(sortedModel1);
listView2->setModel(sortedModel2);
 
QLineEdit *lineEdit =new QLineEdit;
 
QHBoxLayout *hLayout=new QHBoxLayout;
QVBoxLayout *vLayout=new QVBoxLayout;
 
hLayout->addWidget(listView1);
hLayout->addWidget(listView2);
 
vLayout->addWidget(lineEdit);
vLayout->addLayout(hLayout);
 
auto group=new QWidget;
group->setLayout(vLayout);
setCentralWidget(group);
 
    connect(listView1, &QListView::clicked, this,
            [sortedModel2, dict](const QModelIndex &index){
 
        if(!dict.isEmpty()){
            QString str=index.data().toString();
            QString str2=dict.value(str);
            sortedModel2->setFilterRegExp(str2);
        }
    });
 
    connect(lineEdit, &QLineEdit::textChanged, this,
            [sortedModel1, sortedModel2, dict](const QString &str){
        sortedModel1->setFilterRegExp(str);
        if(!dict.isEmpty()){
            QString str2=dict.value(str);
            if(!str2.isEmpty())
                 sortedModel2->setFilterRegExp(str2);
            else sortedModel2->setFilterRegExp(" ");
        }
    });
}
 
MainWindow::~MainWindow()
{
}

Название: minidict.gif
Просмотров: 167

Размер: 115.6 Кб
0
459 / 357 / 69
Регистрация: 29.05.2018
Сообщений: 1,052
29.01.2022, 15:43  [ТС] 5
Цитата Сообщение от sdf45 Посмотреть сообщение
оба списка должны быть одинаковой длинны
Да, я это тоже предполагаю.
Цитата Сообщение от sdf45 Посмотреть сообщение
при клике на строку в списке англ. слов, или вводе текста в поле ввода - ищем в словаре сопоставленный перевод и фильтруем регуляркой модель списка перевода
Вот тут мне как раз хотелось бы, чтобы списки иностранного языка и перевода были синхронизированы, то есть чтобы одновременно с фильтрацией английских слов фильтровались и переводы.
Чувствую, что проще будет использовать просто другой интерфейс, с одним списком, одним лайнэдитом и комбо для выбора языка ввода. А по двойному клику на элемент списка выдавать в отдельном диалоговом окне статью с переводом/переводами.
0
1072 / 678 / 182
Регистрация: 30.03.2021
Сообщений: 2,120
29.01.2022, 16:17 6
Цитата Сообщение от Ender Che Посмотреть сообщение
Вот тут мне как раз хотелось бы, чтобы списки иностранного языка и перевода были синхронизированы, то есть чтобы одновременно с фильтрацией английских слов фильтровались и переводы.
Как я понял (правильно ли?), фильтруем англ. список , чтобы он, например, вывел все слова, начинающиеся на "We". При этом ру. список должен вывести переводы всех этих слов? Если так то навскидку, надо отфильтровать регуляркой словарь (в отдельный словарь? в пару списков строк для англ и ру?) и работать уже с этими данными (тоесть фильтрацию делать в словаре а не в модели, т.к. модель англ слов ничего не знает про модель ру слов, и наоборот... Или создавать свою модель фильтрации, где реализовать это сопоставление-по другому я сейчас не представляю...)

Добавлено через 19 минут
пока курил, еще вариант такой пришел :
-фильтруем QSortFilterProxyModel моделью первый список (англ)
-теперь в первом представлении QListView будут только нужные нам англ.слова
-получаем из представления QListView англ.слов список нужных англ. слов
-переписываем из QMap<англ, ру> где ключем будет англ.слово из отфильтрованного списка, в список русских слов в отдельный QStringList
-ставим этот список setStringList() в обычную QStringListModel списка два (ру)
0
459 / 357 / 69
Регистрация: 29.05.2018
Сообщений: 1,052
29.01.2022, 17:56  [ТС] 7
Цитата Сообщение от sdf45 Посмотреть сообщение
Как я понял (правильно ли?), фильтруем англ. список , чтобы он, например, вывел все слова, начинающиеся на "We". При этом ру. список должен вывести переводы всех этих слов?
Да, верно.
Цитата Сообщение от sdf45 Посмотреть сообщение
пока курил, еще вариант такой пришел
Да, это может сработать. Надо будет попробовать.

Вообще же прихожу к выводу, что ошибся с выбором интерфейса. Можно было бы сделать просто QTableView и QLineEditами вместо заголовков, но я помню, как работал над этим Джон Кофи...
0
1072 / 678 / 182
Регистрация: 30.03.2021
Сообщений: 2,120
29.01.2022, 18:37 8
Ender Che, вот такой вариант есть, но чет неполадки с регуляркой, курю мануалы, но может быстрее подскажете где моя ошибка?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 connect(lineEdit, &QLineEdit::textChanged, this,
            [sortedModel1, sortedModel2, dict](const QString &str){
 
        sortedModel1->setFilterRegExp(str);//фильтруем модель англ. слов по вооду из lineEdit
        QStringList listEng;
        for(int i=0; i<sortedModel1->rowCount();++i){
            listEng<<sortedModel1->index(i,0,QModelIndex()).data().toString();//забираем получившийся список
        }
 
        QStringList listRu;
        foreach(auto item, listEng){
                 listRu<<dict.value(item);//выбираем из словаря перевод в отдельный список
        }
 
        qDebug()<<listRu; //выводит, например "два три"
        QString str2;
        foreach(auto word, listRu){
            str2.append(QString("[%1]").arg(word).trimmed());//формируем регулярку "[два][три]"
        }
        qDebug()<<str2;
        //фильтруем модель ру слов
        sortedModel2->setFilterRegExp(str2.trimmed());//не срабатывает регулярка...
//если строго задам str2="[два][три]" то работает
    });
}
Цитата Сообщение от Ender Che Посмотреть сообщение
как работал над этим Джон Кофи...
можно ссылочку плиз?
0
459 / 357 / 69
Регистрация: 29.05.2018
Сообщений: 1,052
29.01.2022, 18:49  [ТС] 9
Цитата Сообщение от sdf45 Посмотреть сообщение
можно ссылочку плиз?
Вот, только на другом ресурсе: https://evileg.com/ru/forum/topic/1408/ Здесь тем в разы больше даже на хабе C++ Qt
0
1072 / 678 / 182
Регистрация: 30.03.2021
Сообщений: 2,120
29.01.2022, 18:52 10
Ender Che, я понял что регулярку непрально написал, подскажите как написать чтобы выбирало из строки определенные слова? За ссылку спс)
0
459 / 357 / 69
Регистрация: 29.05.2018
Сообщений: 1,052
29.01.2022, 19:01  [ТС] 11
Цитата Сообщение от sdf45 Посмотреть сообщение
sortedModel2->setFilterRegExp(str2.trimmed());//не срабатывает регулярка...
//если строго задам str2="[два][три]" то работает
Так в первом случае она меняется "на лету", а во втором случае const QString &pattern.

Добавлено через 8 минут
Цитата Сообщение от sdf45 Посмотреть сообщение
я понял что регулярку непрально написал, подскажите как написать чтобы выбирало из строки определенные слова?
Доползу до работы в понедельник, может что и наваяю. У меня там хороший пример с регулярками лежит, а дома его нет. Если другие участники форума не помогут. Так-то я с регулярками на "вы", никак они у меня в голове не укладываются. Вроде синусов с косинусами.))
0
1072 / 678 / 182
Регистрация: 30.03.2021
Сообщений: 2,120
29.01.2022, 19:05 12
Цитата Сообщение от Ender Che Посмотреть сообщение
Так в первом случае она меняется "на лету", а во втором случае const QString &pattern.
сорри я неулавливаю разницы...
вобщем я загруз на регулярке
получаю список/ или строку нужных слов
теперь надо отфильтровать модель регуляркой что бы вывела слова только из этого списка, но... ушел кароче читать регексп

Добавлено через 3 минуты
Цитата Сообщение от Ender Che Посмотреть сообщение
Так-то я с регулярками на "вы"
+100500, вроде вот [abc] это фраза из либо а, либо b. либо с , тоесть abc bca cba и так далее? вопщем, ушел учиться
0
459 / 357 / 69
Регистрация: 29.05.2018
Сообщений: 1,052
29.01.2022, 19:05  [ТС] 13
Цитата Сообщение от sdf45 Посмотреть сообщение
сорри я неулавливаю разницы...
Возможно, я тоже что-то неправильно объясняю... Попробуйте вначале присвоить переменной результаты преобразования trimmed(), а потом подставить эту переменную в setFilterRegExp().
0
1072 / 678 / 182
Регистрация: 30.03.2021
Сообщений: 2,120
29.01.2022, 19:10 14
Ender Che, я уже как только не пробовал, и [abc | vfh | eyhh ] и без обрезки, но это все такое, надо концептуально понять

Добавлено через 1 минуту
(С) Стругацкие : "...шлифуются новички..."
0
459 / 357 / 69
Регистрация: 29.05.2018
Сообщений: 1,052
29.01.2022, 19:12  [ТС] 15
Цитата Сообщение от sdf45 Посмотреть сообщение
я уже как только не пробовал
А так: (mail|letter|correspondence)
1
1072 / 678 / 182
Регистрация: 30.03.2021
Сообщений: 2,120
29.01.2022, 19:24 16
Цитата Сообщение от Ender Che Посмотреть сообщение
А так: (mail|letter|correspondence)
о! вот так вроде работает спасибо! щас составление строки наваяю и попробую)))

Добавлено через 7 минут
вот так на скорую руку, теперь допилить немного и (С) Стругацкие: "...сумму прописью..."

Не по теме:

(чет "Пикник на обочине" в голову засел :) )

C++ (Qt)
1
2
3
4
5
6
7
8
9
QString str2;
        foreach(auto word, listRu){
            str2.append(QString("|%1").arg(word).trimmed());
        }
        str2.remove(0,1);
        str2.append(')');
        str2.prepend('(');
        qDebug()<<str2.trimmed();
        sortedModel2->setFilterRegExp(str2.trimmed());
0
459 / 357 / 69
Регистрация: 29.05.2018
Сообщений: 1,052
29.01.2022, 19:27  [ТС] 17
Цитата Сообщение от sdf45 Посмотреть сообщение
foreach(auto word, listRu)
Вместо foreach можно и так: for(QString word : listRu)
1
1072 / 678 / 182
Регистрация: 30.03.2021
Сообщений: 2,120
29.01.2022, 19:31 18
Цитата Сообщение от Ender Che Посмотреть сообщение
Вместо foreach можно и так: for(QString word : listRu)
это range for знаю, спасиб
0
459 / 357 / 69
Регистрация: 29.05.2018
Сообщений: 1,052
29.01.2022, 19:33  [ТС] 19
Цитата Сообщение от sdf45 Посмотреть сообщение
это range for знаю, спасиб
Меня просто по рукам пару раз били за foreach, запомнил.
0
1072 / 678 / 182
Регистрация: 30.03.2021
Сообщений: 2,120
29.01.2022, 19:41 20
Цитата Сообщение от Ender Che Посмотреть сообщение
Меня просто по рукам пару раз били за foreach, запомнил.
а чем аргументировали? бросьте им std::for_each прямо в лицо

Добавлено через 1 минуту
а сверху еше навалите итераторов в стиле java и в стиле std ))))
0
29.01.2022, 19:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2022, 19:41
Помогаю со студенческими работами здесь

WPF+XNA метод texture.SetData
Разрабатываю программу WPF и решил графику перенести в XNA и столкнулся с проблемой: метод ...

Как правильно переопределить метод SetData?
Добрый день, написал делегат(чекбокс), который отлично работает, вставил его в колонку, проблема в...

как правильно переопределить метод SetData
Добрый день, написал делегат(чекбокс), который отлично работает, вставил его в колонку, проблема в...

QSqlTableModel. SetData - не вставляет незаполненные строки в таблицу
Есть созданная база данных. Есть виджет, который позволяет эти данные просматривать, редактировать,...

Переопределить метод setData() QSqlQueryModel, что бы изменять цвет текста
Нужно переопределить метод setData() QSqlQueryModel, что бы изменять цвет текста


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru