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

What is the proper way to forward QProgressBar updates through classes in the logic layer?

本文关键字:更新 QProgressBar 是什么 方式 转发      更新时间:2023-10-16

我正在使用QProgressBar,并且已经知道如何通过以下过程从逻辑层中的特定类发送进度:

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

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

例如:

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

我试图模仿这个过程来使用从类B到C的连接和信号,但它似乎不起作用。

任何答案都将不胜感激

我会在逻辑层和ui层之间创建一个称为服务层的中间层,并放入接口类来连接这两个层。这个服务层的基础是从ui接收消息,并知道从逻辑层返回什么。然后,您的服务层会将消息发送到逻辑层,然后它可以创建您期望从逻辑层返回的类的虚拟实现。填充到混凝土层,并将其传递回ui层。这可能有点令人困惑,但这是因为它确实令人困惑。这是一个被称为n层应用程序或许多其他名称的大主题,但一本关于设计模式的好书可能会对处理一个需要c++接口的项目有所帮助,但你可能总是可以通过用c#等其他语言应用的设计模式来抽象这些想法。希望这能有所帮助,很抱歉,这不是你可以直接打字和看到的东西,但我相信,对你的尝试有一个很好的了解会比解决临时信号槽机制问题更有益。如果你确实提供了更多的代码,我可能能够诊断你的当前情况。

您可以使用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的文档中看到类似的示例。

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

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

class LogicClass1 : public QObject
{
    Q_OBJECT
   .
   .
   .

最重要的是(因为我忘了):右键单击项目并"Run qmake":)