MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Qtのコントロール - リストのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Qtのコントロール - リスト
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Qtにおいて、<code>QListWidget</code>クラスを使用してリストのコントロールの手順を記載する。<br> <br> <u>似た名前のウィジェットにリストビューがあるので間違えないように注意すること。</u><br> <br> ここでは、リストのコントロールIDをlistWidgetとしている。<br> <br><br> == アイテムの追加 == <syntaxhighlight lang="c++"> listWidget->clear(); // 文字列を追加する場合 listWidget->addItem( tr("何か文字列") ); </syntaxhighlight> <br><br> == 現在のアイテムの文字列を取得 == <syntaxhighlight lang="c++"> QListWidgetItem *pItem = listWidget->currentItem(); QString str = pItem->text(); </syntaxhighlight> <br><br> == 選択されているアイテムを取得 == 複数選択が有効になっている場合、複数選択されているアイテムを取得するため、以下のように記述する。<br> <syntaxhighlight lang="c++"> // 選択されているアイテムのリストを取得 QList<QListWidgetItem *> listItems = listWidget->selectedItems(); // 個別のアイテムに対する処理 for(int i = 0; i < listItems.size(); i++) { QListWidgetItem *pItem = listItems[i]; } </syntaxhighlight> <br><br> == 選択されているアイテムの削除 == Qtの公式ドキュメントには、<code>takeItem</code>メソッドを使用してリストのアイテムを削除するとの記述があるが、<br> <code>takeItem</code>メソッドは引数に行番号を1つ渡すだけであるため、複数選択の場合、それらをまとめて削除することができない。<br> <br> 複数選択の場合、まとめて削除する方法は、以下のように記述する。<br> <syntaxhighlight lang="c++"> qDeleteAll(listWidget->selectedItems()); </syntaxhighlight> <br> また、以下の方法においても、まとめて削除することができる。<br> <syntaxhighlight lang="c++"> QList<QListWidgetItem *> itemList = listWidget->selectedItems(); for(int i=0; i < itemList.size(); i++) { widget->takeItem(listWidget->indexFromItem(itemList[i])); } </syntaxhighlight> <br><br> == リストにファイル名リストを追加する == ファイル名に数を含む場合、例えば、"file1 file2 ... file10 file11"のようなファイル名リストをコントロールに追加する場合、<br> リストの標準メソッドに存在するソートを使用すると、"file1 file10 file11 file2 ..."のように並び替えられてしまう。<br> <br> 数値の大きさ順にファイルを並べるソートをナチュラルソートと呼ぶが、現在、QtのAPIには該当機能は実装されていないため、<br> ナチュラルソート関数を作成する必要がある。<br> <br> Windowsの場合、<code>StrCmpLogicalW</code>関数を使用して、ナチュラルソートを実装することができる。 <br> <syntaxhighlight lang="c++"> // MainWindow.cpp #if defined(Q_OS_WIN) // 比較関数 bool MainWindow::lessThan(QString &left, QString &right) { LPCWSTR pszwLeft, pszwRight; pszwLeft = (LPCWSTR)left.unicode(); pszwRight = (LPCWSTR)right.unicode(); return StrCmpLogicalW(pszwLeft, pszwRight) < 0; } #endif // 複数選択したファイルリストをリストウィジェットに追加する関数 void MainWindow::browseImage() { QStringList listFileName = QFileDialog::getOpenFileNames(this, "Select files", "<検索ディレクトリのパス>", "File(*.*)"); if(listFileName.size() == 0) { // ファイルが存在しない場合 return; } #if defined(Q_OS_WIN) qSort(listFileName.begin(), listFileName.end(), lessThan); #elif defined(Q_OS_LINUX) QCollator collator; collator.setNumericMode(true); std::sort(listFileName.begin(), listFileName.end(), [&collator](const QString &file1, const QString &file2) { return collator.compare(file1, file2) < 0; }); #endif for(int i = 0; i < listFileName.size(); i++) { listWidget->addItem(listFileName.at(i)); } } </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // MainWindow.h class MainWindow : public QMainWindow { Q_OBJECT // ...略 void browseImage(); #if defined(Q_OS_WIN) static bool lessThan(QString &left, QString &right); #endif // ...略 }; </syntaxhighlight> <br> <code>QTreeView</code>クラスや<code>QTableView</code>クラスの場合は、<code>QSortFilterProxyModel</code>クラスを継承した派生クラスを作成して、ナチュラルソート関数を作成する方法もある。<br> 以下のGoogle codeのプロジェクトが採用している。<br> [http://code.google.com/p/kamicmd/ kamicmd - Modern file manager - Google Project Hosting]<br> <br><br> __FORCETOC__ [[カテゴリ:Qt]]
Qtのコントロール - リスト
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse