Qt/C++ - Tutorial 067. Using QMultiMap for a dictionary of synonyms

Qt, QStandardItemModel, QMultiMap, QTableView

QMultiMap is a class inherited from QMap, which allows you to store multiple values for a single key. That is, the key can be repeated. This class can be used, for example, to represent a dictionary of synonyms.

Let's write a small program that will contain two tables:

  1. A table with keys
  2. A table with values that will be synonymous with words in the first table.

Initially, the table with the keys will be filled, while the table with the values will be empty. When you click on a row in the key table, the value table will be filled with synonyms of the word whose string was clicked.

Appearance of the application:

Project structure

  • QMultiMapExample.pro - Project profile, created by default and does not change
  • main.cpp - The file with the main function is created by default and does not change.
  • widget.ui - Form the application window, create a window, as in the picture above.
  • widget.h - Application window header file
  • widget.cpp - The source file for the application window.

widget.h

To implement the task, we need the QMultiMap itself, which will contain the entire dictionary. The dictionary can be filled from a file, or manually through a special input that you can provide, or in any other ways. And in this case, we fill the dictionary of synonyms when the application is launched. There will be three keys and each will be three synonyms.

We will also need data models to display the QMultiMap keys and values in the tables. To do this, we use QStandardItemModel .

And we'll write a slot for processing the click on the rows in the key table. In this slot, we will fill out the value table.

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMultiMap>
#include <QStandardItemModel>
#include <QModelIndex>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

public slots:
    void wordsTableViewClicked(const QModelIndex &index);

private:
    Ui::Widget *ui;
    QMultiMap<QString, QString> m_synonymousMap;
    QStandardItemModel m_keysModel;
    QStandardItemModel m_valuesModel;
};

#endif // WIDGET_H

widget.cpp

The data model will be enough to install into the tables once, after which we will clean them if necessary.

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // We fill the dictionary of synonyms
    m_synonymousMap.insert("daemon", "demon");
    m_synonymousMap.insert("daemon", "devil");
    m_synonymousMap.insert("daemon", "demonic");

    m_synonymousMap.insert("chief", "head");
    m_synonymousMap.insert("chief", "senior");
    m_synonymousMap.insert("chief", "superior");

    m_synonymousMap.insert("road", "roadway");
    m_synonymousMap.insert("road", "high road");
    m_synonymousMap.insert("road", "highway");

    // We take away all the keys and fill the model of these keys
    // QMultiMap :: uniqueKey () method returns a list of keys without duplicates
    // the usual method keys () will return keys in this dictionary three times, 
    // whereas this method will return each key once
    for (auto key : m_synonymousMap.uniqueKeys())
    {
        m_keysModel.appendRow(new QStandardItem(key));
    }

    // Set data models in tables
    ui->wordsTableView->setModel(&m_keysModel);
    ui->synonymsTableView->setModel(&m_valuesModel);

    // Connect a click signal to the line to process this click in the slot
    connect(ui->wordsTableView, &QTableView::clicked, this, &Widget::wordsTableViewClicked);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::wordsTableViewClicked(const QModelIndex &index)
{
    // We clear the data model so that there are no synonyms of the previous key
    m_valuesModel.clear();

    // And fill the value model with synonyms
    // Since only one column is used in the row, 
    // we immediately take the key with the transmitted index from the model that is in the key table
    for (auto value : m_synonymousMap.values(ui->wordsTableView->model()->data(index).toString()))
    {
        m_valuesModel.appendRow(new QStandardItem(value));
    }
}

Conclusion

As a result, we get an application that looks like the one shown in the figure at the beginning of the article.

Download application project

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Donate

Hello, Dear Users of EVILEG!!!

If the site helped you, then support the development of the site financially, please.

You can do it by following ways:

Thank you, Evgenii Legotckoi

p
Feb. 17, 2020, 1:41 p.m.
pstMem

C++ - Тест 003. Условия и циклы

  • Result:85points,
  • Rating points6
z
Feb. 17, 2020, 5:02 a.m.
zet

C++ - Test 006. Enumerations

  • Result:80points,
  • Rating points4
z
Feb. 17, 2020, 4:49 a.m.
zet

C++ - Test 001. The first program and data types

  • Result:80points,
  • Rating points4
Last comments
Feb. 17, 2020, 2:22 a.m.
Evgenij Legotskoj

Добрый день. Это кастомный тег, помещается в файл, который находится в каталоге templatetags myapp/ templatetags/ myapp.py
B
Feb. 16, 2020, 12:36 p.m.
BahaMeirman

Добрый вечер! Монжно по подробней о теге get_companion? ссылка не работает.
Feb. 16, 2020, 8:35 a.m.
Evgenij Legotskoj

Добрый день. На GitHub исходники, можете посмотреть в официальном репозитории
B
Feb. 16, 2020, 8:29 a.m.
BahaMeirman

Здравстсвуйте Евгений, непонятно мне где эти исходники найти?
Now discuss on the forum
Feb. 18, 2020, 2:16 p.m.
Mihailll

Нет, стоит minLevel=1 А что это значит? Поменял на 0, но ничего не изменилось. Файл настроек выглядит так [listener]; host=192.168.0.100port=8080minThreads=4maxThreads=100…
Feb. 18, 2020, 6:19 a.m.
Pavel.K

Привет , кто -нибудь подскажет как реализовать перетаскивание обьектов из листвью , и как это вообще делается ? Суть в том ,чтобы при объекта из листвью модели ,знать что за обьект. В…
V
Feb. 17, 2020, 2:11 p.m.
Vitali

Добрый день. Сейчас инициализация моего приложение выглядит приблизительно так: sys_argv = sys.argvsys_argv += ['--style', 'material']app = QGuiApplication(sys_argv)app.setWindowIcon…
Feb. 16, 2020, 1:13 p.m.
BlinCT

Всем привет. есть те кто сталкивался с данной прогой? Нужна наводка просто как правильно из кучи инфы что содержит файл trace.dat и скармливается kernelshark вытащить причину долгого с…
IP
Feb. 16, 2020, 10:35 a.m.
Igor' Poroshin

#include <QSqlError>#include <QSqlQuery>...if (!model->select()) { qDebug() << model->lastError().text(); qDebug() << model->query().lastQue…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB