2012年8月6日 星期一

[Qt] - 建立自己的class


建立自己的class
Part 1 
延續上一個章節,我們可以開始組自己的class程式,並將該class放置在自己建立的檔案當中,如果未還有其他程式需要用到,那就可以直接include 這個檔案,就可以再度使用這個class了。這邊假設我們要建立一個新的檔案,該檔案必須要有一個檔頭檔(.hpp)與程式碼(cpp)這兩個檔案,新增方式如下圖


Haders右鍵,點選Add New...,並選擇C++ ,C++ Header File,如下圖所示


Name地方輸入你要的檔頭名稱


點選Finish結束新增


回到mainwindiw.hpp檔案中,我們必須將檔投給include進來,如下圖所示。


打開剛剛所新增的檔案cvcore.h,並開示進行檔頭編寫動作,其空白檔頭只會有下面這幾行字,我們必須在這幾行字中進行編寫。

接下來我們新增一個最簡單的Filp應用,其相關程式如下圖所示,其中包含我們要建立的Class ,該Class名稱為CVCore。



cvcore.h
#ifndef CVCORE_H
#define CVCORE_H

#include <opencv2/core/core.hpp>                        
#include <opencv2/imgproc/imgproc.hpp>

//建立我們自己的class 名稱為CVCore
class CVCore      
{
//於該私有變數裡面,新增result變數,該變數屬於cv::Mat類別
private:
    // image containing resulting image.
    cv::Mat result;


public:

    // Flip an image.
    cv::Mat flip(const cv::Mat &image);

};



#endif // CVCORE_H

接下來要加入原始碼.cpp檔案於Sources點右鍵,新增C++ Sources File檔案,如下圖所示。

檔名為cvcore.cpp

以下我們建立一個最簡單的flip的class,其程式碼如下圖所示。


#include "cvcore.h"


cv::Mat CVCore::flip(const cv::Mat &image) {
    cv::flip(image,result,1);
    return result;
}

最後我們必須修改mainwindow.hpp檔案,並加入一個字定義變數來承接CVCore 這個class類別,如下圖所示,利用該方式,以後輸入IPTool,及代表CVCore物件。利用IPTool變數來代表CVCore有個好處,那就是未來程式不怎麼修改,你知需要在檔頭部分,將IPTool修改成我們要的Class類別,這樣就可以輕鬆轉換了,不需要再到程式碼裡面去進行修改。

當上述動作都做完之後,我們就可以開始使用我們所建立的class了,請打開mainwindow.cpp,並編輯process image按鈕動作,將該動作改成"result=IPtool.flip(result);",這樣就可以簡單輕鬆使用我們的程式碼了。

Part2
於上述動作中,其實Flip動作中可以讓使用這自訂Flip翻轉的參數設定,那我們要怎麼在自定義變數中增加一個資料結構,並使用這個資料結構中之變數來讓Flip執行不同翻轉的動作呢?首先你必須在cvcore.h檔案中之public變數中加入該資料結構的宣告,假設我們這邊自定義一個資料結構稱之為CVCore,那你將可以利用CVCore();進行資料結構宣告,並將會使用到之變數於private中進行宣告,這邊我們宣告一個FlipCode,作為動作判斷之變數,如下圖所示。


接下來開啟cvcore.cpp檔案,並將資料結構CVCore::CVCore之相關變數輸入,如下圖所示。

接下來可以加入該class,於cvcore.h中加入檔頭屬性,如下圖所示。


// Flip an image with FlipCode.
    cv::Mat flip(const cv::Mat &image, const int &FlipCode);


接下來可以在你的程式碼檔案中編寫該class動作了,開啟cvcore.cpp檔案,並加入程式碼如下圖所示。

cv::Mat CVCore::flip(const cv::Mat &image, const int &FlipCode) {
    cv::flip(image,result,FlipCode);
    return result;
}


程式碼都完成後,我們再新增另外一個按鈕,按鈕名稱為Button_Flip_Down,並新增按鈕動作,於程式碼中輸入上述程式指令,如下圖所示。

    result=IPtool.flip(result,-1);
    UpdateQImage(result);

結果

原始

Flip Down

沒有留言:

張貼留言