Evgenii Legotckoi
Evgenii LegotckoiМаусым 15, 2017, 2:58 Т.Ж.

Qt/C++ - 067-сабақ. Синонимдік сөздік үшін QMultiMap қолданбасын пайдалану

QMultiMap - QMap жүйесінен алынған класс, ол бір кілт үшін бірнеше мәндерді сақтауға мүмкіндік береді. Яғни, кілт қайталануы мүмкін. Бұл сыныпты, мысалы, синонимдер сөздігін көрсету үшін пайдалануға болады.

Екі кестеден тұратын шағын программа жазайық:

  1. Кілттері бар үстел
  2. Бірінші кестедегі сөздерге синоним болатын мәндері бар кесте.

Бастапқыда кілттері бар кесте толтырылады, ал мәндері бар кесте бос болады. Кілттік кестедегі жолды басқан кезде мәндер кестесі сөздің синонимдерімен толтырылады, оның жолында шерту жасалған.

Қолданбаның көрінісі:


Жоба құрылымы

  • 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));
    }
}

Барлығы

Нәтижесінде біз мақаланың басындағы суретте көрсетілгенге ұқсас қосымшаны аламыз.

Қолданба жобасын жүктеп алу

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Бізді әлеуметтік желілерде бақылаңыз