我正在使用QProgressBar,并且已经知道如何通过以下过程从逻辑层中的特定类发送进度:
- 在视图图层类中设置连接
- 在逻辑层类中创建信号信号
- 修改所述逻辑层类,使得其为QObject
- 调用QObject作为逻辑层的基类构造函数
现在,我希望逻辑层中的特定类通过另一个类发送进度。
例如:
- A类(在视图层中):为B类中的进度创建连接
- B类(在逻辑层):为C类中的进度创建连接
- 类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":)