Qt学習の道(59):プラットフォームにまたがるプログラムの作成


以前の文章の例はfor Windowsで、for Linuxやfor Macがないと文句を言っている友達がいます.では、今日はプラットフォームをまたぐ問題についてお話ししましょう.
プラットフォームにまたがるとは、ハードウェアにまたがるプラットフォームとソフトウェアにまたがるプラットフォームの2つの意味があります.ハードウェアプラットフォームについては、ハードウェアの違いは大きいが、私たちが接触できることは少ないので、思わず無視することが多い.現在、PCシリーズは基本的に互換性があり、コンパイラがこの問題を解決するのに役立つ可能性があります.そのため、プログラムがアセンブリ言語を使用していない場合、このようなプラットフォーム間でのサポートは基本的に考慮しにくいです.しかし、プログラムがハードウェアに触れる必要がある場合は、機能の必要性にかかわらず、パフォーマンスの必要性にかかわらず、この問題を考慮しなければなりません.例えば、Photoshopの色処理は、最良のパフォーマンスを達成するためにアセンブリ言語を直接使用して作成され、ハードウェアに関する問題を考慮せざるを得ません.通常、プラットフォームにまたがり、ソフトウェアのみのプラットフォーム、すなわちオペレーティングシステムにまたがると言います.現在主流のオペレーティングシステムWindows、Linux/Unixは、基本的に2つの陣営と言えるでしょう.それらの間のソフトウェアは互換性がないので、このようなプラットフォームは私たちが接触していることが多いです.
クロスプラットフォームといえば、Javaを言わざるを得ません.これはJavaのセールスポイントの一つである「一度に作成し、あちこちで実行する」です.Javaがプラットフォーム間で実現できるのは、Javaソースコードが中間コードにコンパイルされ、Javaプログラムが実行され、実際にはJVMにあるからです.あなたが作成したJavaプログラムはプラットフォームをまたいでいますが、JVMはプラットフォームをまたいでいません.オペレーティングシステムに基づいてJVMを選択する必要があります.これはアダプタモードの一般的な応用です:-)
プラットフォームにまたがるライブラリを選択すると、Qtなどの作業量が少なくなります.Qtはすでに多くのプラットフォーム関連のコードをパッケージ化してくれました.Qtのソースコードを開くと、オペレーティングシステムに関する多くの判断が見つかる可能性があります.簡単に言えば、QMainWindow::show()を使用してウィンドウを表示できます.Windowsでは、QtはWin 32 APIを呼び出して完了しなければならない.Linuxでは、GNOMEまたはKDEのAPIを呼び出す必要がある場合があります.しかし、いずれにしても、このコードは私たちの関心ではありません.Qtは私たちのために完成したからです.だから、もしあなたのプログラムがプラットフォームに関連するコードがなければ、Windowsでコンパイルに成功し、Linuxで再コンパイルしたり、簡単なテストをしたり、UIの割合を調整したりするだけで、発行することができます.
しかし、一部のコードがオペレーティングシステムに依存しなければならない場合、例えばディレクトリをリストするコマンドを呼び出すと、Windowsの下にdirがあり、Linuxの下にlsがある場合は、プラットフォームに基づいてコンパイルしなければなりません.ここではこの例を使ってみましょう.
mainwindow.h

  
  
  
  
  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.  
  4. #include <QMainWindow>  
  5.  
  6. class QProcess;  
  7.  
  8. class MainWindow : public QMainWindow  
  9. {  
  10.     Q_OBJECT  
  11.  
  12. public:  
  13.     MainWindow(QWidget *parent = 0);  
  14.     ~MainWindow();  
  15.  
  16. private slots:  
  17.     void openProcess();  
  18.     void readResult(int exitCode);  
  19.  
  20. private:  
  21.     QProcess *p;  
  22. };  
  23.  
  24. #endif // MAINWINDOW_H 

mainwindow.cpp

  
  
  
  
  1. #include <QProcess>  
  2. #include <QPushButton>  
  3. #include <QMessageBox>  
  4. #include <QTextCodec>  
  5.  
  6. #include "mainwindow.h"  
  7.  
  8. MainWindow::MainWindow(QWidget *parent)  
  9.     : QMainWindow(parent)  
  10. {  
  11.     p = new QProcess(this);  
  12.     QPushButton *bt = new QPushButton("display"this);  
  13.     connect(bt, SIGNAL(clicked()), this, SLOT(openProcess()));  
  14. }  
  15.  
  16. MainWindow::~MainWindow()  
  17. {  
  18.  
  19. }  
  20.  
  21. void MainWindow::openProcess()  
  22. {  
  23. #if defined(Q_OS_WIN32)  
  24.     p->start("cmd.exe", QStringList() << "/c" << "dir");  
  25. #elif defined(Q_OS_LINUX)  
  26.     p->start("ls", QStringList() << "/home/usr_name");  
  27. #endif  
  28.     connect(p, SIGNAL(finished(int)), this, SLOT(readResult(int)));  
  29. }  
  30.  
  31. void MainWindow::readResult(int exitCode)  
  32. {  
  33.     if(exitCode == 0) {  
  34. #if defined(Q_OS_WIN32)  
  35.         QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");  
  36.         QString result = gbkCodec->toUnicode(p->readAll());  
  37. #elif defined(Q_OS_LINUX)  
  38.         QTextCodec* utfCodec = QTextCodec::codecForName("UTF-8");  
  39.         QString result = utfCodec->toUnicode(p->readAll());  
  40. #endif  
  41.         QMessageBox::information(this"dir", result);  
  42.     }  
  43. }  

例は前と同じですが、cppファイルにコードを追加しただけです.我々は#ifこれらの前処理命令を用いてQ_を判断するOS_WIN 32のようなマクロが存在するかどうかは、対応するプラットフォームに関連するコードを生成する.これらのマクロはQtで定義されており、それらが存在するかどうかによって判断するだけです.これにより、WindowsとLinuxの両方でプログラムをコンパイルして実行できます.
プラットフォームにまたがるプログラミングを行うには、文文字符号化など、プラットフォームに関連するものに触れる必要があります.だからできるだけQtが提供する標準関数を使ってプログラミングすることを提案して、このようにif判断をたくさん書く必要がなくて、コードももっとはっきりしています.