13,168
回編集
(ページの作成:「== 概要 == Qtにおいて、<code>QListWidget</code>クラスを使用してリストのコントロールの手順を記載する。<br> <br> <u>似た名前のウィ…」) |
|||
| 54行目: | 54行目: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | |||
== リストにファイル名リストを追加する == | |||
ファイル名に数を含む場合、例えば、"file1 file2 ... file10 file11"のようなファイル名リストをコントロールに追加する場合、<br> | |||
リストの標準メソッドに存在するソートを使用すると、"file1 file10 file11 file2 ..."のように並び替えられてしまう。<br> | |||
<br> | |||
そこで、リストの標準メソッドを使用せずに、独自にソート関数を作成してコントロールに追加する必要がある。<br> | |||
Windowsの場合、<code>StrCmpLogicalW</code>関数がこのような文字列を数字順にソートすることができる。 <br> | |||
<syntaxhighlight lang="c++"> | |||
// 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)); | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// MainWindow.h | |||
class MainWindow : public QMainWindow | |||
{ | |||
Q_OBJECT | |||
// ...略 | |||
void browseImage(); | |||
static bool lessThan(QString &left, QString &right); | |||
// ...略 | |||
}; | |||
</syntaxhighlight> | |||
<br> | |||
QTreeViewクラスやQTableViewクラスの場合は、QSortFilterProxyModelクラスを継承した派生クラスを作成してセットする方法もある。<br> | |||
以下のGoogle codeのプロジェクトが採用している。<br> | |||
[http://code.google.com/p/kamicmd/ kamicmd - Modern file manager - Google Project Hosting]<br> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:Qt]] | [[カテゴリ:Qt]] | ||