您不应该想到通过信号和插槽连接的两个库,而是一组类/类实例、一组与后端相关的类和一组与 UI 相关的类。UI 类使用后端类(但绝不会反过来)。这两组类位于不同的库中是部署的实现细节,与 C++ 级别的应用程序设计几乎无关。即使所有代码在单个应用程序中链接在一起,设计概念也是相同的。
具有单个信号的单个“公共类”signalUpdateGUIStatus(QString)
很可能是错误的方法。仅仅因为它是一个单独的库,就将接口限制为单个类甚至信号是没有意义的。小接口很好 - 但除非您的后端代码只发送一种非常特定的更新,否则“signalUpdateUIStatus(QString whatChangedEncodedAsString)”将通过单个类/信号做太多事情。signalUpdateGUIStatus 还暗示后端库知道有一个 UI。它不应该。它只是提供有关网络上设备的信息——无论是显示信息的 UI 还是某些通过电子邮件(或其他)发送通知的机器人都与它无关。
您可以拥有一个共享库,其中包含 LightSensorListener、TemperatureSensorListener 等(或只是 DeviceListener、depends)等导出类,这些类可能是 QObject 在值更改时发出信号,但也有任何其他 Q_PROPERTY、方法等。这些类将被实例化在应用程序中然后连接到 UI 代码。
想想你是如何在你的应用程序中使用 Qt 的。您的库将是另一个库,您可以使用其类从网络获取数据。就像您使用 QString、QWidget、QLineEdit 等来创建 UI 并与之交互一样,您将使用库的类与网络进行交互:
假设我们的库“foo”有一个温度传感器类:
//file TemperatureSensor.h
/**
* A temperature sensor on the network.
* yaddayaddayadda
*/
class FOO_EXPORT TemperatureSensor {
Q_OBJECT
Q_PROPERTY(QString address READ address WRITE setAddress NOTIFY addressChanged)
Q_PROPERTY(bool available READ available NOTIFY availableChanged)
Q_PROPERTY(qreal temperature READ temperature NOTIFY temperatureChanged)
public:
/**
* Creates a temperature sensor
*
* @param parent parent QObject
*/
explicit TemperatureSensor(QObject* parent=0);
/**
* Returns whether the device is currently available and delivering data
*/
bool available() const;
/**
* Returns the temperature reported by the sensor (In Celsius)
*/
qreal temperature() const;
/**
* Makes the device explode. Use with caution!
* Don't give this to little developers/children.
*/
void blowUp();
//address(), setAddress() etc...
Q_SIGNALS:
/**
* The availability of the sensor changed
*
* @param available whether the sensor is now available
*/
void availableChanged(bool available);
void temperatureChanged(qreal);
void addressChanged(const QString&);
};
然后是应用程序,您只需创建实例并将它们与您的 UI 挂钩:
TemperatureSensor sensor;
sensor.setAddress("/tempsensors/1234");
TemperaturWidget widget;
widget.show();
//connect signals from sensor, or pass the whole sensor instance, etc.
对于文档,应该记录库的所有公共类(即导出的所有内容)。信号/插槽通常像其他“正常”方法一样记录。