Qtのコントロール - リスト

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

Qtにおいて、QListWidgetクラスを使用してリストのコントロールの手順を記載する。

似た名前のウィジェットにリストビューがあるので間違えないように注意すること。

ここでは、リストのコントロールIDをlistWidgetとしている。


アイテムの追加

 listWidget->clear();
 
 // 文字列を追加する場合
 listWidget->addItem( tr("何か文字列") );



現在のアイテムの文字列を取得

 QListWidgetItem *pItem = listWidget->currentItem();
 QString str = pItem->text();



選択されているアイテムを取得

複数選択が有効になっている場合、複数選択されているアイテムを取得するため、以下のように記述する。

 // 選択されているアイテムのリストを取得
 QList<QListWidgetItem *> listItems = listWidget->selectedItems();
 
 // 個別のアイテムに対する処理
 for(int i = 0; i < listItems.size(); i++)
 {
    QListWidgetItem *pItem = listItems[i];
 }



選択されているアイテムの削除

Qtの公式ドキュメントには、takeItemメソッドを使用してリストのアイテムを削除するとの記述があるが、
takeItemメソッドは引数に行番号を1つ渡すだけであるため、複数選択の場合、それらをまとめて削除することができない。

複数選択の場合、まとめて削除する方法は、以下のように記述する。

 qDeleteAll(listWidget->selectedItems());


また、以下の方法においても、まとめて削除することができる。

 QList<QListWidgetItem *> itemList = listWidget->selectedItems();
 for(int i=0; i < itemList.size(); i++)
 {
    widget->takeItem(listWidget->indexFromItem(itemList[i]));
 }



リストにファイル名リストを追加する

ファイル名に数を含む場合、例えば、"file1 file2 ... file10 file11"のようなファイル名リストをコントロールに追加する場合、
リストの標準メソッドに存在するソートを使用すると、"file1 file10 file11 file2 ..."のように並び替えられてしまう。

そこで、リストの標準メソッドを使用せずに、独自にソート関数を作成してコントロールに追加する必要がある。
Windowsの場合、StrCmpLogicalW関数がこのような文字列を数字順にソートすることができる。

 // MainWindow.cpp
 
 // 比較関数
 bool MainWindow::lessThan(QString &left, QString &right)
 {
    LPCWSTR pszwLeft, pszwRight;

 #if defined(Q_OS_WIN)
    pszwLeft = (LPCWSTR)left.unicode();
    pszwRight = (LPCWSTR)right.unicode();
 #elif defined(Q_OS_LINUX)
    
 #endif
 
    return StrCmpLogicalW(pszwLeft, pszwRight) < 0;
 }
 
 // 複数選択したファイルリストをリストウィジェットに追加する関数
 void MainWindow::browseImage()
 {
    QStringList strlFName = QFileDialog::getOpenFileNames(this, "Select files",  "C:\\", "File(*.*)");
    if(strlFName.size() == 0)
    {
       return;
    }
 
    qSort(strlFName.begin(), strlFName.end(), lessThan);
 
    for(int i = 0; i < strlFName.size(); i++)
    {
       listWidget->addItem(strlFName.at(i));
    }
 }


 // MainWindow.h
 
 class MainWindow : public QMainWindow
 {
    Q_OBJECT
    // ...略
 
    void browseImage();
    static bool lessThan(QString &left, QString &right);
 
    // ...略
 };


QTreeViewクラスやQTableViewクラスの場合は、QSortFilterProxyModelクラスを継承した派生クラスを作成してセットする方法もある。
以下のGoogle codeのプロジェクトが採用している。
kamicmd - Modern file manager - Google Project Hosting