📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…
 
(同じ利用者による、間の2版が非表示)
60行目: 60行目:
リストの標準メソッドに存在するソートを使用すると、"file1 file10 file11 file2 ..."のように並び替えられてしまう。<br>
リストの標準メソッドに存在するソートを使用すると、"file1 file10 file11 file2 ..."のように並び替えられてしまう。<br>
<br>
<br>
そこで、リストの標準メソッドを使用せずに、独自にソート関数を作成してコントロールに追加する必要がある。<br>
数値の大きさ順にファイルを並べるソートをナチュラルソートと呼ぶが、現在、QtのAPIには該当機能は実装されていないため、<br>
Windowsの場合、<code>StrCmpLogicalW</code>関数がこのような文字列を数字順にソートすることができる。 <br>
ナチュラルソート関数を作成する必要がある。<br>
<br>
Windowsの場合、<code>StrCmpLogicalW</code>関数を使用して、ナチュラルソートを実装することができる。 <br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  // MainWindow.cpp
  // MainWindow.cpp
   
   
#if defined(Q_OS_WIN)
  // 比較関数
  // 比較関数
  bool MainWindow::lessThan(QString &left, QString &right)
  bool MainWindow::lessThan(QString &left, QString &right)
  {
  {
     LPCWSTR pszwLeft, pszwRight;
     LPCWSTR pszwLeft, pszwRight;
 
   
  #if defined(Q_OS_WIN)
     pszwLeft = (LPCWSTR)left.unicode();
     pszwLeft = (LPCWSTR)left.unicode();
     pszwRight = (LPCWSTR)right.unicode();
     pszwRight = (LPCWSTR)right.unicode();
#elif defined(Q_OS_LINUX)
   
#endif
   
   
     return StrCmpLogicalW(pszwLeft, pszwRight) < 0;
     return StrCmpLogicalW(pszwLeft, pszwRight) < 0;
  }
  }
#endif
   
   
  // 複数選択したファイルリストをリストウィジェットに追加する関数
  // 複数選択したファイルリストをリストウィジェットに追加する関数
  void MainWindow::browseImage()
  void MainWindow::browseImage()
  {
  {
     QStringList strlFName = QFileDialog::getOpenFileNames(this, "Select files",  "C:\\", "File(*.*)");
     QStringList listFileName = QFileDialog::getOpenFileNames(this, "Select files",  "<検索ディレクトリのパス>", "File(*.*)");
     if(strlFName.size() == 0)
     if(listFileName.size() == 0)
     {
     { // ファイルが存在しない場合
       return;
       return;
     }
     }
   
   
     qSort(strlFName.begin(), strlFName.end(), lessThan);
#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;
                                                        });
    // または、以下の記述でも良い
    std::sort(listFileName.begin(), listFileName.end(), collator);
#endif
   
   
     for(int i = 0; i < strlFName.size(); i++)
     for(int i = 0; i < listFileName.size(); i++)
     {
     {
       listWidget->addItem(strlFName.at(i));
       listWidget->addItem(listFileName.at(i));
     }
     }
  }
  }
107行目: 119行目:
   
   
     void browseImage();
     void browseImage();
#if defined(Q_OS_WIN)
     static bool lessThan(QString &left, QString &right);
     static bool lessThan(QString &left, QString &right);
#endif
   
   
     // ...略
     // ...略
113行目: 128行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
QTreeViewクラスやQTableViewクラスの場合は、QSortFilterProxyModelクラスを継承した派生クラスを作成してセットする方法もある。<br>
<code>QTreeView</code>クラスや<code>QTableView</code>クラスの場合は、<code>QSortFilterProxyModel</code>クラスを継承した派生クラスを作成して、ナチュラルソート関数を作成する方法もある。<br>
以下のGoogle codeのプロジェクトが採用している。<br>
以下のGoogle codeのプロジェクトが採用している。<br>
[http://code.google.com/p/kamicmd/ kamicmd - Modern file manager - Google Project Hosting]<br>
[http://code.google.com/p/kamicmd/ kamicmd - Modern file manager - Google Project Hosting]<br>
<br><br>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:Qt]]
[[カテゴリ:Qt]]