Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB

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

10% refund of hotel reservation amount on Booking
10% refund of hotel reservation amount on Booking
We offer a link with a 10% return on the amount of the order when booking a hotel through Booking

Comments

Only authorized users can post comments.
Please, Log in or Sign up
МБ
April 21, 2019, 9:40 a.m.
Моисей Бушуев

Qt - Test 001. Signals and slots

  • Result:0points,
  • Rating points-10
AA
April 17, 2019, 7:40 p.m.
Anton Ablin

Qt - Test 001. Signals and slots

  • Result:73points,
  • Rating points1
E
April 17, 2019, 6:16 p.m.
Evgeny

Qt - Test 001. Signals and slots

  • Result:100points,
  • Rating points10
Last comments
April 21, 2019, 4:22 p.m.
Евгений Легоцкой

Через метод setIcon table.horizontalHeaderItem(0).setIcon("qrc://path/to/icon.png")
April 21, 2019, 3:48 p.m.
Евгений Легоцкой

Добрый день! Спасибо за комментарий. Там действительно лучше будет сделать с инициализацией по умолчанию.
U
April 18, 2019, 3:37 p.m.
Unreal_man

А как иконку в хедер задать?
u
April 18, 2019, 2:15 a.m.
uaa

доброго времени,большое спасибо за пример для начинающего)при адаптации к своему проекту столкнулся с таким ньансом:в vepolyline.h в 47 строке нужна инициализация по умолчанию: int m_pointF...
E
April 11, 2019, 12:49 p.m.
Evgeny

Спасибо за ответ) У меня компоновщик на нее ругался просто. Оказалось, просто забыл Q_OBJECT в начале класса указать.
Now discuss on the forum
April 24, 2019, 11:22 a.m.
Ruslan Polupan

Согласен. но ситуация не поменялась. Такое чуство что данные не записываются в модель.
April 24, 2019, 6:20 a.m.
Ruslan Polupan

я так понимаю надо инфорация об устройствах.Я бы пробовал так rust@suse:~> lsblk -PNAME="sda" MAJ:MIN="8:0" RM="0" SIZE="111,8G" RO="0" TYPE="disk" MOUNTPOINT=""NAME="sda1" MAJ:MIN="8...
April 21, 2019, 4:16 p.m.
Евгений Легоцкой

Приветствую Нужно сохранять где-то выбранное значение, а потом восстанавливать его. Или использовать QSettings или добавить метод open(), в который передавать начальные значения для того...
R
April 19, 2019, 9:55 a.m.
RED_Spider

мені важко це зараз навіть перевірити, тому що знайшов коміт, це ще було в 2016 році, і цей код не буде працювати коректно зараз, єдине скажу що це були QThread
Join us in social networks

For registered users on the site there is a minimum amount of advertising