2012-08-07 33 views
0

我有以下佈局:Qt的:通過C類從ClassA的傳遞變量ClassB的

MainWindow <--------- Settings 
    \ 
    \ 
     V 
    PerformOps 

主窗口接受來自設置傳遞的變量,並把它們傳遞到PerformOps。 如果未使用Settings類,則MainWindow將默認傳遞給PerformOps。

目前我做的:

class Settings{ 

public: 
    Settings(*parent); 
    var1, var2, var3 
    . 
    . 
    void exec(); 
} 

class PerformOps{ 

public: 
    PerformOps(); 
    var1, var2, var3; 
    . 
    . 
    void start(); 
} 


class MainWindow{ 

private: 
    Settings *set; //share pointers over all methods 
    PerformOps *op; 

    bool settings_not_clicked = false; 

    void saveChanges() 
    { 
    QSettings settings("my","app"); 
    settings.setValue("value1", op->var1); 
    settings.setValue("value2", op->var2); 
    settings.setValue("value3", op->var3); 
    } 

    void loadChanges() 
    { 
    QSettings settings("my","app"); 
    op->var1 = settings.value("value1"); 
    op->var2 = settings.value("value2"); 
    op->var3 = settings.value("value3"); 

    } 

    void closeEvent(QCloseEvent *event) 
    { 
     event->ignore(); 
     saveChanges(); 
     event->accept(); 
    } 

    void takeDataAndDoStuff() //This is always called 
    { 
    op = new PerformOps; 

    if(settings_not_clicked) { 
     loadChanges() 
    } 
    else { 
     op->var1 = 33; 
     op->var2 = "Geronimo!"; 
     op->var3 = true;    
    } 

    op->start(); 
    } 


    void getStuff_maybe_if_clicked() //This might not be always called 
    { 
    Settings *set = new Settings(this); 
    set->exec()  //Pause parent, run Settings 

    settings_not_clicked = false; 
    } 

問:是否有不訴諸骯髒的方法來共享跨類數據的更清潔的方式:op->var1 = set->var1;,考慮到該set指針可能並不總是被初始化?

+0

只是想知道(無關的問題),你知道'QSettings'ç姑娘? – SingerOfTheFall 2012-08-07 10:06:08

+0

我無法遵循這是什麼問題..你爲什麼稱它爲「髒」? – 2012-08-07 10:14:15

+0

@SingerOfTheFall是的,我正在使用它 - 這是我的問題的主要來源。 例如,當我保存更改時,我從'set'指針寫入所有值。但是當閱讀我的更改時,我在哪裏閱讀?回到設置指針?這是不允許的。 – tetris11 2012-08-07 10:14:24

回答

1

那麼,方法本身並不是很糟糕,但有一些事情可以改進。

首先,如果我正確地理解了你,你想傳遞設置,如果他們存在,並且傳遞默認值,如果他們不。在這種情況下,你可以利用構造函數:

class PerformOps 
{ 
public: 
    PerformOps(int v1 = 33, string v2 = "Geronimo!", bool v3 = true): var1(v1), var2(v2), var3(v3) 
    { 
    } 
    <...> 
} 

現在,如果調用構造函數PerformOps(),默認值將被設置。如果你調用它,給它一些值,它會使用它們:

<...> 
PerformOps *op; 

if(settings_not_clicked) { 
    op = new PerformOps(set->var1, set->var2, set->var3); 
} 
else { 
    op = new PerformOps();    
} 
<...> 
當然

,如果你不想通過cunstructor做到這一點,你可以只讓一個函數並調用它像「setData()」,並使用與缺省函數參數相同的技術。


現在,至於指針。如果你有C++ 0x,那麼總是是一個好主意,用NULLnullptr初始化指針。此外,刪除內存時,請將指針再次指定爲NULLnullptr。通過這種方式,您將能夠通過簡單的檢查始終查看指針是否有效。

someClass * ptr = nullptr; 
<...> 
ptr = new someClass(); 
<...> 
delete ptr; 
ptr = nullptr; 

UPD

我建議你擺脫你的Settings類的,只是直接使用QSettings。你不需要弄亂指針,而讀寫QSettings的速度非常快。

現在,也不要忘記,你可以使用QSettings從堆:

QSettings * settings = new QSettings(); 

如果你想設置有一個「父」每個設置,只需從QSettings派生Settings類,只需在其中添加一個parent字段即可。這將保持QSettings的所有功能,這非常方便。

實際上,你的方法也很好,你所要做的只是檢查指針是否有效。

+0

好吧讓我編輯我的問題 - 我剛剛意識到它的QSettings相關 – tetris11 2012-08-07 10:18:42

+0

好吧,我會那樣做 - 歡呼 – tetris11 2012-08-07 10:38:04

0

好的,所以問題是「我正在設置一個指針可能或不可能存在的指針」。在這種情況下Null Object模式應該有所幫助。這樣,你應該可以擺脫if-子句

0

哦,等等。 我才意識到,我可以使用類之間QSettings(這是什麼SingerOfTheFall顯然是在暗示什麼)

所以從我的Settings.cpp類我可以這樣做:

QSettings sett("my"); 
sett.begingroup("my_groupname"); 
sett.setValue("value1", var1); 
sett.setValue("value2", var2); 
sett.setValue("value3", var3); 
sett.endGroup(); 

,我可以檢索相同的信息從任何類(!咄)這樣做:

someRandomClass.cpp:

QSettings settings("my"); 
settings.beginGroup("my_groupname"); 
myvar1 = settings.value("value1"); 
myvar2 = settings.value("value2"); 
myvar3 = settings.value("value3"); 
settings.endGroup(); 
相關問題