qt c++,观察者模式,设置两个观察者,请举例
时间: 2024-03-26 22:39:13 浏览: 15
好的,我来回答你的问题。
在 Qt C++ 中,可以通过观察者模式实现对象之间的松耦合,当被观察者发生改变时,观察者会收到通知并进行相应的操作。
为了演示观察者模式的使用,我举一个例子:假设有一个温度计类 Temperature,它可以测量当前的温度,并且可以设置两个观察者,分别是显示温度的窗口类 TempWindow 和控制电风扇的类 Fan。
Temperature 类的头文件如下:
```cpp
#ifndef TEMPERATURE_H
#define TEMPERATURE_H
#include <QObject>
class Temperature : public QObject
{
Q_OBJECT
public:
explicit Temperature(QObject *parent = nullptr);
signals:
void temperatureChanged(double temp);
public slots:
void setTemperature(double temp);
private:
double m_temperature;
};
#endif // TEMPERATURE_H
```
Temperature 类有一个成员变量 m_temperature,用于存储当前温度值;另外,它还定义了一个信号 temperatureChanged,用于在温度值发生改变时发送信号通知观察者。
TempWindow 类的头文件如下:
```cpp
#ifndef TEMPWINDOW_H
#define TEMPWINDOW_H
#include <QWidget>
namespace Ui {
class TempWindow;
}
class TempWindow : public QWidget
{
Q_OBJECT
public:
explicit TempWindow(QWidget *parent = nullptr);
~TempWindow();
private slots:
void onTemperatureChanged(double temp);
private:
Ui::TempWindow *ui;
};
#endif // TEMPWINDOW_H
```
TempWindow 类是一个窗口类,用于显示当前温度值;它有一个槽函数 onTemperatureChanged,用于接收 Temperature 类发出的 temperatureChanged 信号,并更新窗口上的温度值。
Fan 类的头文件如下:
```cpp
#ifndef FAN_H
#define FAN_H
#include <QObject>
class Fan : public QObject
{
Q_OBJECT
public:
explicit Fan(QObject *parent = nullptr);
public slots:
void onTemperatureChanged(double temp);
private:
bool m_isOn;
};
#endif // FAN_H
```
Fan 类是一个控制电风扇的类,它有一个槽函数 onTemperatureChanged,用于接收 Temperature 类发出的 temperatureChanged 信号,并根据温度值控制电风扇的开关。
现在,我们可以在 main.cpp 中创建 Temperature、TempWindow 和 Fan 对象,并设置它们之间的观察者关系。
```cpp
#include <QApplication>
#include "temperature.h"
#include "tempwindow.h"
#include "fan.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 创建对象
Temperature *temp = new Temperature();
TempWindow *tempWindow = new TempWindow();
Fan *fan = new Fan();
// 设置观察者关系
QObject::connect(temp, &Temperature::temperatureChanged,
tempWindow, &TempWindow::onTemperatureChanged);
QObject::connect(temp, &Temperature::temperatureChanged,
fan, &Fan::onTemperatureChanged);
// 显示窗口
tempWindow->show();
return a.exec();
}
```
在 main 函数中,我们首先创建 Temperature、TempWindow 和 Fan 对象;然后,通过 QObject::connect 函数建立观察者关系,将 Temperature 对象的 temperatureChanged 信号连接到 TempWindow 对象的 onTemperatureChanged 槽函数和 Fan 对象的 onTemperatureChanged 槽函数;最后,显示 TempWindow 窗口。
这样,当 Temperature 对象的温度值发生改变时,TempWindow 和 Fan 对象就会收到通知,并进行相应的操作。