通过逻辑层中的类转发QProgressBar更新的正确方法是什么?

时间:2013-02-14 00:06:57

标签: c++ qt qprogressbar

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

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

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

例如:

  1. A类(在视图层中):为B类中的进度创建连接。
  2. B类(在逻辑层中):为C类中的进度创建连接。
  3. C类:更新进度,以便在A类(视图层)中看到。
  4. 我试图模仿this procedure使用连接和从B到C的信号,但它似乎没有用。

    任何答案都将不胜感激

3 个答案:

答案 0 :(得分:1)

我会在逻辑层和ui层之间创建一个称为服务层的中间层,我会在接口类中连接这两层。该服务层的基础是从ui获取消息并知道从逻辑层返回什么。然后,您的服务层将消息发送到逻辑层,然后它可以创建您希望从逻辑层返回的类的虚拟实现。填写具体的植入物并将它们传递回ui层。这可能有点混乱,但那是因为它。这是一个很大的主题,被称为n层应用程序或许多其他名称,但实际上一本关于设计模式的好书可能有助于在需要c ++接口的项目上工作,但是你总是可以通过设计模式应用于另一种语言,如c#。希望这有点帮助,对不起它不是你可以打字和看到的东西,但是对我想要做的事情有一个很好的理解我相信比仅仅通过临时信号槽机制问题更有益。如果您确实提供了更多代码,我可以诊断您当前的情况。

答案 1 :(得分:1)

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

// 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的文档中看到类似的示例。

答案 2 :(得分:1)

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

当然,LogicClass1应该继承QObject,如上所述 -

class LogicClass1 : public QObject
{

    Q_OBJECT
   .
   .
   .

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