- 1. Структура проекту
- 2. віджет.h
- 3. widget.cpp
- 4. Підсумок
QMultiMap є класом, успадкованим від QMap, який дозволяє зберігати кілька значень одного ключа. Тобто, ключ може повторюватися. Цей клас може бути використаний, наприклад, для представлення словника синонімів.
Напишемо невелику програму, яка міститиме дві таблиці:
- Таблицю з ключами
- Таблицю зі значеннями, які будуть синонімами слів у першій таблиці.
Спочатку таблиця із ключами буде заповнена, тоді як таблиця зі значеннями буде порожньою. При натисканні рядка в таблиці ключів, таблиця значень буде заповнюватися синонімами того слова, рядком якого було зроблено клік.
Зовнішній вигляд програми:
Структура проекту
- QMultiMapExample.pro - профайл проекту, створюється за замовчуванням і не змінюється
- main.cpp - файл із функцією main, створюється за замовчуванням і не змінюється.
- widget.ui - форма вікна програми, створюємо вікно, як на малюнку вище.
- widget.h - заголовний файл вікна програми
- widget.cpp - файл вихідних кодів вікна програми.
віджет.h
Для реалізації поставленого завдання нам знадобиться сам QMultiMap , який міститиме весь словник. Словник можна заповнювати з файлу, або вручну через спеціальне введення, яке ви можете передбачити, або будь-якими іншими способами. А в даному випадку заповнимо словник синонімів при запуску програми. Буде три ключі і кожного буде по три синоніми.
Також нам будуть необхідні моделі даних для відображення ключів та значень QMultiMap у таблицях. Для цього скористаємося QStandardItemModel.
І напишемо слот для обробки кліка по рядках у таблиці ключів. У цьому слоті виконуватимемо заповнення таблиці значень.
#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
Моделі даних достатньо встановити в таблиці один раз, після чого будемо очищати їх при необхідності.
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); // Заполняем словарь синонимов 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"); // Забираем все ключи и заполняем модель данных ключей // метод QMultiMap::uniqueKey() возвращает список ключей без повторов // обычный метод keys() будет возвращать ключи в данном словаре по три раза // тогда как этот метод вернёт каждый ключ один раз for (auto key : m_synonymousMap.uniqueKeys()) { m_keysModel.appendRow(new QStandardItem(key)); } // устанавливаем модели данных в таблицы ui->wordsTableView->setModel(&m_keysModel); ui->synonymsTableView->setModel(&m_valuesModel); // Подключаем сигнал клика по строке для обработке этого клика в слоте connect(ui->wordsTableView, &QTableView::clicked, this, &Widget::wordsTableViewClicked); } Widget::~Widget() { delete ui; } void Widget::wordsTableViewClicked(const QModelIndex &index) { // Очищаем модель данных, чтобы не было синонимов предыдущего ключа m_valuesModel.clear(); // и заполняем модель значений синонимами // Поскольку в строке используется только одна колонка, // то сразу забираем ключ с помощью переданного индекса из модели, которая находится в таблице ключей for (auto value : m_synonymousMap.values(ui->wordsTableView->model()->data(index).toString())) { m_valuesModel.appendRow(new QStandardItem(value)); } }
Підсумок
В результаті отримаємо програму, яка буде виглядати так, як показано на малюнку на початку статті.