- 1. Жоба құрылымы
- 2. виджет.h
- 3. widget.cpp
- 4. Барлығы
QMultiMap - QMap жүйесінен алынған класс, ол бір кілт үшін бірнеше мәндерді сақтауға мүмкіндік береді. Яғни, кілт қайталануы мүмкін. Бұл сыныпты, мысалы, синонимдер сөздігін көрсету үшін пайдалануға болады.
Екі кестеден тұратын шағын программа жазайық:
- Кілттері бар үстел
- Бірінші кестедегі сөздерге синоним болатын мәндері бар кесте.
Бастапқыда кілттері бар кесте толтырылады, ал мәндері бар кесте бос болады. Кілттік кестедегі жолды басқан кезде мәндер кестесі сөздің синонимдерімен толтырылады, оның жолында шерту жасалған.
Қолданбаның көрінісі:
Жоба құрылымы
- QMultiMapExample.pro - жоба профилі, әдепкі бойынша жасалған және өзгермейді
- main.cpp - негізгі функциясы бар файл, әдепкі бойынша жасалған және өзгермейді.
- 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)); } }
Барлығы
Нәтижесінде біз мақаланың басындағы суретте көрсетілгенге ұқсас қосымшаны аламыз.