New blog location
New blog location
QTreeView
, a couple of QLineEdit
s, and a search QPushButton
. The UI can look something like the following, with the TreeView on top:mainwindow.h
as follows:#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QStandardItemModel> #include <QItemSelectionModel> #include <QMap> #include <QModelIndex> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; QStandardItemModel model; QItemSelectionModel *selectionModel; void init(); QMap<QString,QModelIndex> searchItemToIndexMap; private slots: void onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); void on_pushButton_clicked(); }; #endif // MAINWINDOW_H
QMap
holds a QString
to QModelIndex
mapping. This is so that when the user searches for a particular string, it is looked up in the dictionary and selected in the TreeView. Note also the selection model and the Standard Item model. on_pushButton_clicked()
is triggered when the Search button is clicked. The code in mainwindow.cpp
follows:#include "mainwindow.h" #include "ui_mainwindow.h" #include <QStandardItem> #include <QObject> #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); init(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::init() { QStringList headers; headers << "My Items"; model.setHorizontalHeaderLabels(headers); QModelIndexList list; QStandardItem *root = model.invisibleRootItem(); for(int p = 0; p < 5; p++) { QStandardItem *parentItem = new QStandardItem(QString("Parent %0").arg(p)); root->appendRow(parentItem); searchItemToIndexMap[QString("Item %1").arg(p)] = parentItem->index(); for(int c = 0; c < 5; c++) { QStandardItem *childItem = new QStandardItem(QString("Child %0").arg(c)); parentItem->appendRow(childItem); for(int s = 0; s < 5; s++) { QStandardItem *subchild = new QStandardItem(QString("SubChild %0").arg(s)); childItem->appendRow(subchild); } } } ui->treeView->setModel(&model); selectionModel = new QItemSelectionModel(&model); ui->treeView->setSelectionModel(selectionModel); connect(selectionModel,&QItemSelectionModel::selectionChanged,this,&MainWindow::onSelectionChanged); } void MainWindow::onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected) { auto list = selected.indexes(); if(list.length() == 0) { return; } auto firstIndex = list.first(); auto selectedData = ui->treeView->model()->data(firstIndex).toString(); ui->lineEdit->setText(selectedData); } void MainWindow::on_pushButton_clicked() { if(searchItemToIndexMap.contains(ui->searchLineEdit->text())) { selectionModel->clearSelection(); selectionModel->select(searchItemToIndexMap[ui->searchLineEdit->text()],QItemSelectionModel::Select); } }
MainWindow
constructor, the init
function is called, which initializes the tree view model, selection model, and sets up the tree view. selectionChanged
signal is connected to a slot.searchLineEdit
are looked up in the dictionary to see if there is a corresponding QModelIndex
. If there is, the select
method of the selectionModel
is invovked with that QModelIndex
object.onSelectionChanged
slot is triggered. Here the list of selected indexes is obtained (only 1 index). The data
function of the QStandardItemModel
is called by passing in the QModelIndex
object, and a QString
representation is obtained and passed to the setText
method of the lineEdit
.
Comments
Post a Comment