0

我有一个关于如何构建应用程序代码的一般性问题。我将 QT 用于 GUI,并通过单击不同的 GUI 元素,有一个相应的插槽(事件处理程序)。所有这些都发生在主窗口类中。但现在我想知道如何更好地构建它。例如,如果一个插槽创建了一个对象,而另一个插槽(函数)想要访问这个对象,那么最好的解决方案是什么?我认为在存储对象的主窗口中有一个变量并不理想。也许是一个包含所有信息并且每个人都可以访问的通用(静态?)类?

4

2 回答 2

1

不要创建每个人都可以访问的静态类。一般来说,全局状态是不好的。

如果您需要让特定的 qobjects 知道来自某个对象的信号,那么您显然需要将它们连接起来。如果该对象将永远存在,那么您可能只是使用主窗口创建您正在创建的对象的父级,但这需要您可以在创建新对象时将所有信号连接到该新对象。

在某些时候,您将需要存储一组对象,这些对象需要在不同时刻动态连接和断开信号。一般来说,您需要坐下来思考对象的用途,并决定谁应该有权访问它。然后,您创建接口来管理该对象的创建、引用和销毁。然后,您创建这些接口的具体实现,并且只将它需要的功能传递给其他类。如果一个对象需要知道如何创建但不使用,则将创建者传递给类。如果它需要知道如何使用而不是创建,则传递一个“用户”。这种情况可能会变得难以想象的复杂,因此您必须尽早做出良好的设计决策,将不同的目的相互隔离。

对于您非常笼统的问题,这是我能提供的最好的。

于 2012-06-26T15:32:17.253 回答
0

You ask: "If a slot creates an object and another slot (function) wants access to this object, what is the best solution?"

Assuming that this is a fitting design for your particular application (a big if!), it's easy to do. Just pass the pointer to the newly made instance as a parameter in the signal. Couldn't be any simpler than that. Make sure that you decide (and stick to it!) on what's the lifetime and ownership of the created instance. The code below simply makes the new instance a child of the object in which it was created. That may or may not apply in your particular case.

class Class : public QObject
{
  Q_OBJECT
public:
  Class(QObject * parent = 0) : QObject(parent) { ... }
signals:
  void madeNew(Class *);
public slots:
  void creator() {
    emit madeNew(new Class(this));
  }
  void consumer(Class * instance) {
    // do something with the new instance
  }
};
于 2012-06-26T23:28:27.740 回答