Qt WidgetsにおけるQColumnView::currentChanged()プログラミングを徹底解説


QColumnView::currentChanged()は、Qt WidgetsにおけるQColumnViewクラスのシグナルであり、ユーザーが現在選択しているアイテムが変更されたときに発生します。このシグナルは、選択されたアイテムに基づいてアクションを実行したり、UIを更新したりするために使用できます。

構文

void currentChanged(const QModelIndex &current, const QModelIndex &previous);

パラメータ

  • previous: 以前選択されていたアイテムのモデルインデックス
  • current: 現在選択されているアイテムのモデルインデックス

使い方

QColumnView::currentChanged()シグナルを接続するには、QObject::connect()関数を使用します。以下の例では、シグナルがスロットmySlot()に接続されています。

QColumnView *columnView = new QColumnView(this);
connect(columnView, &QColumnView::currentChanged, this, &MyClass::mySlot);

mySlot()スロットは、currentパラメータを使用して、現在選択されているアイテムに関する情報を取得できます。たとえば、以下のコードは、選択されているアイテムのテキストを取得してコンソールに出力します。

void MyClass::mySlot(const QModelIndex &current) {
  QString text = current.data();
  qDebug() << text;
}

以下の例では、QColumnViewに接続されたリストビューとボタンがあります。ユーザーがリストビュー内のアイテムを選択すると、ボタンのテキストが選択されたアイテムのテキストに更新されます。

#include <QApplication>
#include <QColumnView>
#include <QPushButton>
#include <QModelIndex>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // モデルを作成する
  QStandardItemModel *model = new QStandardItemModel();
  model->setColumnCount(1);
  model->insertRows(0, 5);

  for (int i = 0; i < 5; ++i) {
    QStandardItem *item = new QStandardItem(QString("Item %1").arg(i + 1));
    model->setItem(i, 0, item);
  }

  // リストビューを作成する
  QColumnView *columnView = new QColumnView();
  columnView->setModel(model);

  // ボタンを作成する
  QPushButton *button = new QPushButton("Get Selected Item");

  // シグナルとスロットを接続する
  connect(columnView, &QColumnView::currentChanged, button, &QPushButton::setText);

  // ウィジェットをレイアウトする
  QVBoxLayout *layout = new QVBoxLayout;
  layout->addWidget(columnView);
  layout->addWidget(button);

  // メインウィンドウを作成する
  QWidget *window = new QWidget;
  window->setLayout(layout);
  window->show();

  return app.exec();
}

この例では、currentChanged()シグナルがQPushButton::setText()スロットに接続されています。currentChanged()シグナルが発行されると、setText()スロットはcurrentパラメータを使用して、選択されているアイテムのテキストを取得し、ボタンのテキストに設定します。

  • QColumnViewには、選択されたアイテムに関する情報を取得するための他のシグナルもあります。たとえば、selectionChanged()シグナルは、選択されたアイテムのセットが変更されたときに発生します。
  • QColumnView::currentChanged()シグナルは、ユーザーがキーボードやマウスを使用してアイテムを選択したときにのみ発生します。プログラムによってアイテムを選択した場合は、シグナルは発生しません。


例1:選択されたアイテムのテキストをコンソールに出力する

この例では、QColumnViewに接続されたリストビューとコンソール出力を表示するウィジェットがあります。ユーザーがリストビュー内のアイテムを選択すると、選択されたアイテムのテキストがコンソールに出力されます。

#include <QApplication>
#include <QColumnView>
#include <QStandardItemModel>
#include <QModelIndex>
#include <QTextStream>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // モデルを作成する
  QStandardItemModel *model = new QStandardItemModel();
  model->setColumnCount(1);
  model->insertRows(0, 5);

  for (int i = 0; i < 5; ++i) {
    QStandardItem *item = new QStandardItem(QString("Item %1").arg(i + 1));
    model->setItem(i, 0, item);
  }

  // リストビューを作成する
  QColumnView *columnView = new QColumnView();
  columnView->setModel(model);

  // コンソール出力を表示するウィジェットを作成する
  QTextEdit *console = new QTextEdit();
  console->setReadOnly(true);

  // シグナルとスロットを接続する
  connect(columnView, &QColumnView::currentChanged, [console](const QModelIndex &current) {
    QString text = current.data();
    console->append(text);
  });

  // ウィジェットをレイアウトする
  QVBoxLayout *layout = new QVBoxLayout;
  layout->addWidget(columnView);
  layout->addWidget(console);

  // メインウィンドウを作成する
  QWidget *window = new QWidget;
  window->setLayout(layout);
  window->show();

  return app.exec();
}

例2:選択されたアイテムに基づいてボタンのテキストを更新する

#include <QApplication>
#include <QColumnView>
#include <QStandardItemModel>
#include <QModelIndex>
#include <QPushButton>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // モデルを作成する
  QStandardItemModel *model = new QStandardItemModel();
  model->setColumnCount(1);
  model->insertRows(0, 5);

  for (int i = 0; i < 5; ++i) {
    QStandardItem *item = new QStandardItem(QString("Item %1").arg(i + 1));
    model->setItem(i, 0, item);
  }

  // リストビューを作成する
  QColumnView *columnView = new QColumnView();
  columnView->setModel(model);

  // ボタンを作成する
  QPushButton *button = new QPushButton("Get Selected Item");

  // シグナルとスロットを接続する
  connect(columnView, &QColumnView::currentChanged, button, &QPushButton::setText);

  // ウィジェットをレイアウトする
  QVBoxLayout *layout = new QVBoxLayout;
  layout->addWidget(columnView);
  layout->addWidget(button);

  // メインウィンドウを作成する
  QWidget *window = new QWidget;
  window->setLayout(layout);
  window->show();

  return app.exec();
}
#include <QApplication>
#include <QColumnView>
#include <QStandardItemModel>
#include <QModelIndex>
#include <QLabel>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // モデルを作成する
  QStandardItemModel *model = new QStandardItemModel();
  model->setColumnCount(2);
  model->insertRows(0, 5);

  for (int i = 0


selectionChanged()シグナルを使用する

selectionChanged()シグナルは、選択されたアイテムのセットが変更されたときに発生します。これは、currentChanged()シグナルよりも汎用性が高い場合があり、単一のアイテムだけでなく、選択されたすべてのアイテムにアクセスする必要がある場合に適しています。

利点

  • 複数のアイテムが選択された場合にも動作します。
  • 選択されたすべてのアイテムにアクセスできます。

欠点

  • 現在選択されているアイテムを特定する必要があります。


connect(columnView, &QColumnView::selectionChanged, this, &MyClass::mySlot);

void MyClass::mySlot(const QModelIndexList &selectedIndexes) {
  for (const QModelIndex &index : selectedIndexes) {
    QString text = index.data();
    qDebug() << text;
  }
}

currentIndex()メソッドを使用する

currentIndex()メソッドは、現在選択されているアイテムのモデルインデックスを返します。このメソッドを使用して、選択されたアイテムに関する情報を取得したり、アクションを実行したりできます。

利点

  • currentChanged()シグナルを接続する必要がありません。
  • コードが簡潔になります。

欠点

  • アイテムが選択されていない場合は、無効なインデックスが返されます。
  • シグナルではないため、スロットに接続できません。


QModelIndex currentIndex = columnView->currentIndex();
if (currentIndex.isValid()) {
  QString text = currentIndex.data();
  qDebug() << text;
}

カスタムスロットを作成する

QAbstractItemView::selectionModel()メソッドを使用して、選択モデルを取得できます。選択モデルには、選択されたアイテムに関する情報を取得したり、アクションを実行したりするためのさまざまなメソッドが用意されています。

利点

  • 特定のニーズに合わせたカスタムロジックを実装できます。
  • 柔軟性と制御性に優れています。

欠点

  • currentChanged()シグナルを使用するよりも多くの作業が必要です。
  • コードが複雑になります。
QAbstractItemModel *model = columnView->model();
QSelectionModel *selectionModel = columnView->selectionModel();
connect(selectionModel, &QSelectionModel::selectionChanged, this, &MyClass::mySlot);

void MyClass::mySlot(const QModelIndexList &selectedIndexes) {
  for (const QModelIndex &index : selectedIndexes) {
    QModelIndex parent = index.parent();
    if (parent.isValid()) {
      QString parentText = parent.data();
      QString childText = index.data();
      qDebug() << parentText << ":" << childText;
    }
  }
}