【问题标题】:What is the proper way to forward QProgressBar updates through classes in the logic layer?通过逻辑层中的类转发 QProgressBar 更新的正确方法是什么?
【发布时间】:2013-02-14 00:06:57
【问题描述】:

我正在使用QProgressBar,并且已经弄清楚如何使用此过程从逻辑层中的特定类发送进度:

  • 在视图层类中设置连接。
  • 在逻辑层类中创建信号信号。
  • 修改逻辑层类,使其成为 QObject。
  • 调用 QObject 作为逻辑层的基类构造函数。

现在,我希望逻辑层中的特定类通过另一个类发送进度。

例如:

  1. A 类(在视图层中):为 B 类中的进度创建连接。
  2. B 类(在逻辑层):为 C 类中的进度创建连接。
  3. C 类:更新进度,以便可以在 A 类(视图层)中看到。

我试图模仿 this procedure 使用从 B 类到 C 类的连接和信号,但它似乎不起作用。

任何答案将不胜感激

【问题讨论】:

    标签: c++ qt qprogressbar


    【解决方案1】:

    我会在逻辑层和ui层之间创建一个中间层,称为服务层,我会放入接口类来连接这两层。该服务层的基础是从 ui 中获取消息,并了解从逻辑层返回的内容。然后,您的服务层会将消息发送到逻辑层,然后它可以创建您期望从逻辑层返回的类的虚拟实现。填写具体的实施并将它们传递回 ui 层。这可能有点令人困惑,但那是因为它是。这是一个很大的话题,被称为 n 层应用程序或许多其他名称,但一本关于设计模式的好书可能对处理需要 c++ 接口的项目有所帮助,但您总是可以通过以下方式抽象这些想法以另一种语言(如 c#)应用的设计模式。希望这对您有所帮助,抱歉,这不是您可以输入并查看的内容,而是对您尝试做的事情有一个很好的理解,我相信这比仅仅解决临时信号槽机制问题更有益。如果您确实提供了更多代码,我也许可以诊断您当前的情况。

    【讨论】:

      【解决方案2】:

      您可以使用 SIGNAL/SIGNAL 连接来转发具有兼容签名的信号。在下面的代码示例中,重要的部分是 LogicClass1 的构造函数中的连接。

      // My other logic class
      class LogicClass1 : public QObject
      {   Q_OBJECT
      public:
          LogicClass1(LogicClass2* lc2)
              : lc2(lc2)
          {
              connect(lc2, SIGNAL(signalPrograssIteration(int)), 
                      this, SIGNAL(signalPrograssIteration(int)));
          }
      
      signals:
          void signalPrograssIteration(int);
      
      private:
          LogicClass2 *lc2;
      };
      
      // My other logic class
      class LogicClass2 : public QObject
      {   Q_OBJECT
      public:
          LogicClass2(){}
      
      signals:
          void signalPrograssIteration(int);
      
      private:
          void doSomething();
      };
      
      // the function that actually does stuff
      void LogicClass2::doSomthing()
      {
          int val = 0;
          for(...)
          {
              .
              .
              emit signalPrograssIteration(val);
              .
              .
          }
      }
      

      您可以在QObject::connect 的文档中看到类似的示例。

      【讨论】:

        【解决方案3】:

        好的,我想通了。 我所做的是将peogress-bar对象从MainWindow(视图层)发送到LogicClass1(逻辑层) 然后将其与 SIGNAL 连接到LogicClass2

        当然,LogicClass1 应该继承自上面提到的 QObject-

        class LogicClass1 : public QObject
        {
        
            Q_OBJECT
           .
           .
           .
        

        最重要的事情(因为我忘了):右键单击项目并“运行 qmake”:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-03
          • 1970-01-01
          • 2017-06-25
          相关资源
          最近更新 更多