Qt:通过类 C 将变量从 ClassA 传递到 ClassB
Posted
技术标签:
【中文标题】Qt:通过类 C 将变量从 ClassA 传递到 ClassB【英文标题】:Qt: Pass variables from ClassA to ClassB via Class C 【发布时间】:2012-08-07 10:05:28 【问题描述】:我有以下布局:
MainWindow <--------- Settings
\
\
V
PerformOps
MainWindow 接收从 Settings 传递的变量,并将它们传递给 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;
问题:考虑到set
指针可能并不总是被初始化,是否有一种更简洁的方法来跨类共享数据而无需使用脏方法:op->var1 = set->var1;
?
【问题讨论】:
只是想知道(与问题无关),你知道QSettings
类吗?
我无法理解是什么问题.. 你为什么称它为“脏”?
@SingerOfTheFall 是的,我实际上正在使用它——它是我问题的主要来源。例如,当我保存更改时,我会写入来自 set
指针的所有值。但是在阅读我的更改时,我在哪里阅读?回到设置指针?这是不允许的。
@RomanSaveljev 因为我正在设置一个指向可能存在也可能不存在的指针的指针
【参考方案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()”一样调用它,并使用与默认函数参数相同的技术。
现在,至于指针。 总是 用NULL
或nullptr
初始化指针是个好主意,如果你有c++0x。此外,当您删除内存时,再次将指针分配给NULL
或nullptr
。这样,您将能够通过简单的检查始终查看指针是否有效。
someClass * ptr = nullptr;
<...>
ptr = new someClass();
<...>
delete ptr;
ptr = nullptr;
UPD
我建议你摆脱 Settings
类,直接使用 QSettings。您不需要弄乱指针,并且对 QSettings 的读/写非常快。
现在,也不要忘记您可以使用堆中的 QSettings:
QSettings * settings = new QSettings();
如果您希望每个设置都有一个“父”,您可以从QSettings
派生您的Settings
类,然后在其中添加一个parent
字段。这将保留QSettings
的所有功能,非常方便。
实际上,您的方法也很好,您只需检查指针是否有效。
【讨论】:
好吧,让我编辑我的问题——我刚刚意识到它与 QSettings 相关【参考方案2】:好的,所以问题是“我正在设置一个指向可能存在或不存在的指针的指针”。在这种情况下,Null Object 模式应该会有所帮助。这样你应该可以摆脱 if 子句
【讨论】:
【参考方案3】:哦,等一下。 我刚刚意识到我可以在类之间使用 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();
我可以通过以下方式从任何类(duh!)中检索相同的信息:
someRandomClass.cpp:
QSettings settings("my");
settings.beginGroup("my_groupname");
myvar1 = settings.value("value1");
myvar2 = settings.value("value2");
myvar3 = settings.value("value3");
settings.endGroup();
【讨论】:
以上是关于Qt:通过类 C 将变量从 ClassA 传递到 ClassB的主要内容,如果未能解决你的问题,请参考以下文章