1

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

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

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

例如:

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

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

任何答案将不胜感激

4

3 回答 3

1

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

于 2013-02-14T04:06:25.673 回答
1

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

于 2013-02-15T01:49:02.330 回答
1

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

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

class LogicClass1 : public QObject
{

    Q_OBJECT
   .
   .
   .

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

于 2013-05-26T16:30:55.413 回答