c++ - Qt:通过 C 类将变量从 ClassA 传递到 ClassB

标签 c++ qt share qsettings

我有以下布局:

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 指针可能并不总是被初始化?

最佳答案

好吧,该方法本身并没有那么糟糕,但是您可以改进一些地方。

首先,如果我对您的理解正确的话,您希望传递设置(如果存在),如果不存在则传递默认值。在这种情况下,您可以使用构造函数:

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 初始化指针,或者如果您有c++0x,则使用nullptr 初始化指针。另外,当你删除内存时,再次将指针赋给NULLnullptr。这样您就可以通过简单的检查始终查看指针是否有效。

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

UPD

我建议您去掉Settings 类,直接使用QSettings。您不需要弄乱指针,读取/写入 QSettings 的速度非常快。

现在,也不要忘记您可以从堆中使用 QSettings:

QSettings * settings = new QSettings();

如果您希望每个设置集都有一个“父级”,您可以从 QSettings 派生您的 Settings 类,然后添加一个 parent 字段放入其中。这样就保留了QSettings的所有功能,非常方便。

其实你的做法也可以,你只需要检查指针是否有效即可。

关于c++ - Qt:通过 C 类将变量从 ClassA 传递到 ClassB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11843597/

相关文章:

qt - Qt中如何获取系统网络状态?

c++ - QRegExpValidator 参数

qt - 在Qt5中创建静态库并使用它

ios - Sharekit2.0 : how can I directly share to facebook and twitter, 而不是通过 UIActionSheet?

Android - 通过 Facebook 分享自定义链接

facebook - yoast创建了多个og图像标签,如何只使用我定义的一个?

c++ - 如何创建一个 cl::sycl::buffers 数组?

c++ - unordered_map::insert vs operator []= 函数给出错误

c++ - 变量参数列表 : use va_list or address of formal parameter?

c++ - 如何使用 OpenGL 渲染在 Qt 界面上显示 IPLImage 流?