「Qtのコントロール - リスト」の版間の差分

ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == 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]]

案内メニュー