Evgenii Legotckoi
Evgenii LegotckoiJune 15, 2017, 2:58 a.m.

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

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.

Do you like it? Share on social networks!

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Дмитрий

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:60points,
  • Rating points-1
Дмитрий

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

  • Result:92points,
  • Rating points8
d
  • dsfs
  • April 26, 2024, 4:56 a.m.

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:80points,
  • Rating points4
Last comments
k
kmssrFeb. 8, 2024, 6:43 p.m.
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVADec. 25, 2023, 10:30 a.m.
Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJoDec. 25, 2023, 8:38 a.m.
Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
GvozdikDec. 18, 2023, 9:01 p.m.
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Now discuss on the forum
G
George13May 7, 2024, 12:27 a.m.
добавить qlineseries в функции в функции: "GPlotter::addSeries(QString title, QVector &arr)" я вызываю метод setChart(...), я в конструктор передал адрес на QChartView элемент
BlinCT
BlinCTMay 5, 2024, 5:46 a.m.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
PS
Peter SonMay 3, 2024, 5:57 p.m.
Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
Evgenii Legotckoi
Evgenii LegotckoiMay 2, 2024, 2:07 p.m.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderCheApril 30, 2024, 4:22 a.m.
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

Follow us in social networks