- 1. Projektstruktur
- 2. Widget.h
- 3. Widget.cpp
- 4. Insgesamt
QMultiMap ist eine von QMap abgeleitete Klasse, mit der Sie mehrere Werte für denselben Schlüssel speichern können. Das heißt, der Schlüssel kann wiederholt werden. Diese Klasse kann beispielsweise verwendet werden, um ein Synonymwörterbuch darzustellen.
Lassen Sie uns ein kleines Programm schreiben, das zwei Tabellen enthält:
- Tabelle mit Schlüsseln
- Eine Tabelle mit Werten, die Synonyme für die Wörter in der ersten Tabelle sein werden.
Zunächst wird die Tabelle mit Schlüsseln gefüllt, während die Tabelle mit Werten leer ist. Wenn Sie in der Schlüsseltabelle auf eine Zeile klicken, wird die Wertetabelle mit Synonymen des Wortes gefüllt, auf deren Zeile geklickt wurde.
Aussehen der Anwendung:
Projektstruktur
- QMultiMapExample.pro - Projektprofil, wird standardmäßig erstellt und ändert sich nicht
- main.cpp - Datei mit der Hauptfunktion, die standardmäßig erstellt wird und sich nicht ändert.
- widget.ui - die Form des Anwendungsfensters, erstellen Sie ein Fenster, wie in der Abbildung oben.
- widget.h - Header-Datei des Anwendungsfensters
- widget.cpp - Quellcodedatei des Anwendungsfensters.
Widget.h
Um die Aufgabe zu implementieren, benötigen wir QMultiMap selbst, die das gesamte Wörterbuch enthalten wird. Das Wörterbuch kann aus einer Datei oder manuell über eine spezielle Eingabe, die Sie bereitstellen können, oder auf andere Weise ausgefüllt werden. Und in diesem Fall füllen wir das Synonymwörterbuch beim Start der Anwendung aus. Es wird drei Schlüssel geben und jeder wird drei Synonyme haben.
Wir werden auch Datenmodelle benötigen, um QMultiMap -Schlüssel und -Werte in Tabellen anzuzeigen. Dafür verwenden wir QStandardItemModel.
Und wir schreiben einen Slot für die Verarbeitung von Klicks auf Zeilen in der Schlüsseltabelle. In diesem Slot füllen wir die Wertetabelle aus.
#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
Es reicht aus, die Datenmodelle einmal in den Tabellen zu installieren, danach werden wir sie bei Bedarf löschen.
#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)); } }
Insgesamt
Als Ergebnis erhalten wir eine Anwendung, die wie in der Abbildung am Anfang des Artikels gezeigt aussieht.