在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C/ 編寫跨平臺的程序
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學(xué)習(xí)之路(18): Qt 標(biāo)準(zhǔn)對話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學(xué)習(xí)之路(tip): parent 參數(shù)
Qt 標(biāo)準(zhǔn)對話框之 QColorDialog
QPainter(續(xù))
國際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對象
QSortFilterProxyModel
國際化(上)
組件布局
自定義 Model 之三
事件過濾器
QDirModel
Hello, world!(續(xù))
Qt 標(biāo)準(zhǔn)對話框之 QFileDialog
自定義 model 之二
深入了解信號槽
坐標(biāo)變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個對話框(下)
Qt 學(xué)習(xí)之路(32): 一個簡易畫板的實現(xiàn)(Graphics View)
文本文件讀寫
自定義事件
編寫跨平臺的程序
MainWindow
初探信號槽
Qt 學(xué)習(xí)之路(17): Qt 標(biāo)準(zhǔn)對話框之 QMessageBox
繪圖設(shè)備
菜單和工具條(續(xù))
二進(jìn)制文件讀寫
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲容器
進(jìn)程間交互
API 文檔的使用
創(chuàng)建一個對話框(上)
一個簡易畫板的實現(xiàn)(QWidget)

編寫跨平臺的程序

看到評論里面有朋友抱怨以前文章里面的例子都是 for Windows 的,沒有 for Linux 或者 for Mac 的。那么今天就來說說跨平臺的問題吧! 所謂跨平臺,其實有兩種含義,一是跨硬件平臺,一是跨軟件平臺。對于硬件平臺,很多時候我們都會不自覺的忽略掉,因為硬件差異雖然很大,但是我們能夠接觸到的卻很少。目前 PC 系列基本都是兼容的,并且編譯器可能會幫助我們完成這個問題,因此如果你的程序沒有用到匯編語言,基本很難考慮到這種跨平臺的支持。但是,如果你的程序需要接觸到硬件,不管是因為功能的需要還是因為性能的需要,就不得不考慮這個問題。比如,Photoshop 的顏色處理直接使用匯編語言編寫,以達(dá)到最好性能,這就不得不考慮硬件相關(guān)的問題。通常我們說跨平臺,更多的只軟件的跨平臺,也就是跨操作系統(tǒng)?,F(xiàn)在主流操作系統(tǒng) Windows,Linux/Unix,基本算作是兩大陣營吧,它們之間的軟件都是不兼容的,所以這種跨平臺是我們接觸比較多的。

說起跨平臺,就不得不提 Java。這是 Java 的賣點之一:“一次編寫,到處運行”。Java 之所以能夠?qū)崿F(xiàn)跨平臺,是因為 Java 源代碼編譯成一種中間代碼,運行 Java 程序,實際上是在 JVM 中。你編寫出的 Java 程序是跨平臺的,但是 JVM 不是跨平臺的,必須根據(jù)你的操作系統(tǒng)選擇 JVM。這是適配器模式的典型應(yīng)用 :-) 選擇一個本身就是跨平臺的庫,你的工作量就會小很多,比如 Qt。Qt 已經(jīng)幫我們封裝好很多平臺相關(guān)的代碼。如果你打開一個 Qt 的源代碼,就可能找到很多關(guān)于操作系統(tǒng)的判斷。簡單來說,我們使用 QMainWindow::show() 就可以顯示一個窗口。在 Windows 上,Qt 必須調(diào)用 Win32 API 完成;在 Linux 上,你就可能需要調(diào)用 GNOME 或者 KDE 的 API。但是,無論如何,這部分代碼都不是我們關(guān)心的,因為 Qt 已經(jīng)替我們完成了。所以,如果你的程序沒有與平臺相關(guān)的代碼,那么只需要在 Windows 上編譯成功,然后拿到 Linux 上重新編譯一下,通過一些簡單測試,或者還需要調(diào)整一下 UI 比例等等,就可以拿去發(fā)行了。 但是,如果有部分代碼不得不依賴操作系統(tǒng),比如我們調(diào)用列出目錄的命令,Windows 下是 dir,而 Linux 下是 ls,這就不得不根據(jù)平臺進(jìn)行編譯了。這里我們就拿這個例子嘗試一下。

mainwindow.h


#ifndef MAINWINDOW_H  
#define MAINWINDOW_H  

#include <QMainWindow>  

class QProcess;  

class MainWindow : public QMainWindow  
{  
    Q_OBJECT  

public:  
    MainWindow(QWidget *parent = 0);  
    ~MainWindow();  

private slots:  
    void openProcess();  
    void readResult(int exitCode);  

private:  
    QProcess *p;  
};  

#endif // MAINWINDOW_H 

mainwindow.cpp


#include <QProcess>  
#include <QPushButton>  
#include <QMessageBox>  
#include <QTextCodec>  

#include "mainwindow.h"  

MainWindow::MainWindow(QWidget *parent)  
    : QMainWindow(parent)  
{  
    p = new QProcess(this);  
    QPushButton *bt = new QPushButton("display", this);  
    connect(bt, SIGNAL(clicked()), this, SLOT(openProcess()));  
}  

MainWindow::~MainWindow()  
{  

}  

void MainWindow::openProcess()  
{  
#if defined(Q_OS_WIN32)  
    p->start("cmd.exe", QStringList() << "/c" << "dir");  
#elif defined(Q_OS_LINUX)  
    p->start("ls", QStringList() << "/home/usr_name");  
#endif  
    connect(p, SIGNAL(finished(int)), this, SLOT(readResult(int)));  
}  

void MainWindow::readResult(int exitCode)  
{  
    if(exitCode == 0) {  
#if defined(Q_OS_WIN32)  
        QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");  
        QString result = gbkCodec->toUnicode(p->readAll());  
#elif defined(Q_OS_LINUX)  
        QTextCodec* utfCodec = QTextCodec::codecForName("UTF-8");  
        QString result = utfCodec->toUnicode(p->readAll());  
#endif  
        QMessageBox::information(this, "dir", result);  
    }  
}  

例子和前面是一樣的,我們只是在 cpp 文件中添加了一些代碼。我們使用 #if 這些預(yù)處理指令通過判斷 Q_OS_WIN32 這樣的宏是否存在,來生成相應(yīng)的平臺相關(guān)的代碼。這些宏是在 Qt 中定義好的,我們只需根據(jù)它們是否存在進(jìn)行判斷。這樣,我們的程序就可以在 Windows 和 Linux 下都可以編譯運行。 進(jìn)行跨平臺編程,你不得不需要接觸到一些平臺相關(guān)的東西,比如文字符編碼等,都是需要好哈學(xué)習(xí)的。所以建議是盡可能使用 Qt 提供的標(biāo)準(zhǔn)函數(shù)進(jìn)行編程,這樣就不必寫一大堆 if 判斷,代碼也更加清晰。

本文出自 “豆子空間” 博客,請務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/193918