リストビューの作り方

リスト関係のクラスはすべてQAbstractItemViewクラスを基本クラスとして継承しています。直に継承しているクラスはQListView, QTreeView, QTableView, QcolimnView, QHeaderViewの5つです。今回はその中のQListViewクラスを継承しているQListWidgetクラスを紹介します。

QListViewWidgetクラス

このクラスは一般的な1つの枠の中に複数の項目が表示されるスタイルのリストです。1つ1つの項目を作るにはQListWidgetItemクラスを使います。

では、ラインエディットから項目名を入力し、エンターキーを押すとそれがリストに追加されるようなプログラムを作ってみます。以下がそのソースファイルです。

MainWidget_H.h
#ifndef MAIN_WIDGET_H
#define MAIN_WIDGET_H

#include <QtGui>

class MainWidget : public QWidget{

Q_OBJECT

public:
    MainWidget();

private slots:
    void addListItem();
        //項目を追加するスロット関数
private:
    QListWidget* listWidget;
    QLineEdit* lineEdit;
};

#endif

addListItemをリストに項目を追加するスロット関数に登録しています。

MainWidget.cpp
#include "MainWidget_H.h"

MainWidget::MainWidget()
{
    setWindowTitle("window");
    setGeometry(200, 200, 200, 300);
    
    listWidget = new QListWidget();
    listWidget->setSortingEnabled(true);
        //並び替えを有効化

    lineEdit = new QLineEdit("項目1");
    connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(addListItem()));
        //エンターが押されたらリストに項目追加
    
    QBoxLayout* box = new QBoxLayout(QBoxLayout::TopToBottom);
    box->addWidget(listWidget);
    box->addWidget(lineEdit);
    setLayout(box);
}

void MainWidget::addListItem()
{
    listWidget->addItem(lineEdit->text());
    listWidget->sortItems(Qt::AscendingOrder);
        //文字コードの値が小さい順に並べ替え
}

connect関数ではreturnPressedというラインエディットでエンターが押されたときに呼ばれるシグナル関数を渡しています。そしてスロット関数であるaddListItemでリストにaddItem関数にラインエディットの内容を追加しています。

さらにリストが更新されるたびに並び替えを行っています。並び替えを行うにはsetSortingEnabled関数にtrueを渡し、sortItems関数で並び替えます。この並び替えには昇順と降順の2つの並び方を選べますが、今回は昇順に並べています。

アイテムの書き換え

リストにアイテムを追加したらそれを書き換えできた方が便利です。そこで先ほどのソースコードを改造してアイテムをダブルクリックしたらそれを書き換えるようなプログラムを作ってみます。

では、まずMainWidget_H.hのスロット関数の部分を以下のように書き換えます。

private slot: のみ抜粋
private slots:
    void addListItem();
        //項目を追加するスロット関数
    void writeItem();
    void closeItemEdit();

2つの関数を追加しましたが、writeItemがアイテムのテキストを変える関数、closeItemEditが編集を終了する関数です。

次にMainWidget.cppを以下のように改造しました。

MainWidget.cpp
#include "MainWidget_H.h"

MainWidget::MainWidget()
{
    setWindowTitle("window");
    setGeometry(200, 200, 200, 300);
    
    listWidget = new QListWidget();
    listWidget->setSortingEnabled(true);
        //並び替えを有効化
    connect(listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, 
                SLOT(writeItem()));
    connect(listWidget, SIGNAL(itemActivated(QListWidgetItem*)), this,
                SLOT(closeItemEdit()));
    /*中略*/
}

/*中略*/

void MainWidget::writeItem()
{
    QListWidgetItem* item = listWidget->currentItem();
        //現在選択されているアイテムを取得
    listWidget->openPersistentEditor(item);
        //アイテム編集ができるようにする。
    listWidget->editItem(item);
        //アイテムの編集
}

void MainWidget::closeItemEdit()
{
    QListWidgetItem* item = listWidget->currentItem();
    listWidget->closePersistentEditor(item);
        //アイテムの編集を終了
}

コンストラクタに2つのconnect関数がありますが、1つめでダブルクリックされたときにwriteItem、2つめでアイテムの入力が完了したらcloseItemEditを呼び出すようにしています。シグナルのitemActivated関数はエンターキーを押したときに発生します。

writeItem関数ではcurrentItemで現在選ばれているアイテムを取得して、openPersistentEditorでアイテム編集のための継続的なエディターを開いています。そしてそのエディターが開いているときに限りeditItemで目的のアイテムを編集できます。

closeItemEditでは開いたエディターを閉じるためにclosePersistentEditer関数を呼び出します。これを呼び出さないとずっとアイテム編集中のままになってしまいます。

リストなどのアイテムを編集するときにはこのようにしてエディターを開かなければアイテムを書き換えられないようになっています。

関連項目
プライバシーポリシー