私たちは数十の異なる設定と環境設定があるプログラムを開発しています。設定のナビゲーションをより使いやすくし、PyCharmやJIdeaのようにテキスト検索を追加したいと考えています。テキスト検索を使用した設定ウィジェット:Qtで何とか実装できますか?
私の知る限り、これは非常に共通の特徴です。 Qtでこのようなことを実装したことはありませんか?
私たちは数十の異なる設定と環境設定があるプログラムを開発しています。設定のナビゲーションをより使いやすくし、PyCharmやJIdeaのようにテキスト検索を追加したいと考えています。テキスト検索を使用した設定ウィジェット:Qtで何とか実装できますか?
私の知る限り、これは非常に共通の特徴です。 Qtでこのようなことを実装したことはありませんか?
QTreeViewとQStandardItemModelを使用することをお勧めします。モデルに設定値を入力し、QLineEdit::textEdited
に接続されたスロットにQStandardItemModel::findItems
を使用して、ユーザーが入力したテキストと一致する1つまたは複数の項目を検索します。 QStandardItemModel::findItems
メソッドのQt :: MatchFlags引数の助けを借りて、検索の実行方法(大文字と小文字の区別、完全一致など)を制御できます。 Qt :: MatchRecursiveを常に設定することは重要ですが、さもなければ、Qtは子アイテムを探しません。ここで
私はあなたのために用意しました例です。
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QTreeView>
#include <QStandardItemModel>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
private:
QStandardItemModel *createModel();
QTreeView *m_treeView;
private slots:
void on_searchTextEdited(const QString &str);
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "MainWindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
QWidget *centralWidget = new QWidget(this);
QVBoxLayout *verticalLayout = new QVBoxLayout(centralWidget);
QLineEdit *editSearch = new QLineEdit(centralWidget);
m_treeView = new QTreeView(centralWidget);
m_treeView->setModel(createModel());
m_treeView->expandAll();
editSearch->setPlaceholderText("Enter search term...");
verticalLayout->addWidget(editSearch);
verticalLayout->addWidget(m_treeView);
setWindowTitle("Tree view with text search");
setCentralWidget(centralWidget);
resize(300, 500);
connect(editSearch, &QLineEdit::textEdited, this, &MainWindow::on_searchTextEdited);
}
QStandardItemModel *MainWindow::createModel()
{
QStandardItemModel *model = new QStandardItemModel(this);
model->appendRow(new QStandardItem("First item"));
model->item(model->rowCount() - 1, 0)->appendRows(QList<QStandardItem *>({new QStandardItem("First subitem"), new QStandardItem("Second subitem")}));
model->appendRow(new QStandardItem("Second item"));
model->appendRow(new QStandardItem("Third item"));
model->item(model->rowCount() - 1, 0)->appendRows(QList<QStandardItem *>({new QStandardItem("Third subitem")}));
model->item(model->rowCount() - 1, 0)->child(0, 0)->appendRows(QList<QStandardItem *>({new QStandardItem("First subsubitem"), new QStandardItem("Second subsubitem")}));
model->appendRow(new QStandardItem("Fourth item"));
model->item(model->rowCount() - 1, 0)->appendRows(QList<QStandardItem *>({new QStandardItem("Fourth subitem"), new QStandardItem("Fifth subitem"), new QStandardItem("Sixth subitem")}));
model->setHorizontalHeaderLabels(QStringList({"Settings"}));
return model;
}
void MainWindow::on_searchTextEdited(const QString &str)
{
QStandardItemModel *model = static_cast<QStandardItemModel *>(m_treeView->model());
QList<QStandardItem *> foundItems = model->findItems(str, Qt::MatchExactly | Qt::MatchRecursive, 0);
m_treeView->clearSelection();
if (!foundItems.isEmpty()) { m_treeView->setCurrentIndex(foundItems.first()->index()); }
}
@Felix、これはあなたのために働いたのですか? – scopchanov
あなたは自動入力補完を意味しますか? – scopchanov
さて、オートコンプリートも便利かもしれませんが、サブウィジェットの名前と内容で検索できるウィジェットを意味します。 – Felix
['objectName'](http://doc.qt.io/qt-5/qobject.html#objectName-prop)がパターンまたは部分文字列に一致するウィジェットを検索することを意味しますか?もしそうなら、['QObject :: findChildren'](http://doc.qt.io/qt-5/qobject.html#findChildren-1)があなたの後になっているかもしれません。 –