2012-08-07 53 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();