qt5泛型模板继承QObject创建以及调用
时间: 2023-07-08 22:15:23 浏览: 148
在 Qt5 中,可以使用泛型模板继承 `QObject`,从而创建一个可用于信号和槽的类。以下是一个示例:
```cpp
template<typename T>
class MyTemplateClass : public QObject {
Q_OBJECT
public:
MyTemplateClass(const T& data) : m_data(data) {}
signals:
void dataChanged(const T& newData);
public slots:
void setData(const T& newData) {
if (newData != m_data) {
m_data = newData;
emit dataChanged(m_data);
}
}
private:
T m_data;
};
```
在这个示例中,我们创建了一个模板类 `MyTemplateClass`,它有一个模板参数 `T`,并继承了 `QObject`。我们在这个类中定义了一个信号 `dataChanged`,以及一个槽 `setData`。当调用 `setData` 时,如果新数据与旧数据不同,就会发出 `dataChanged` 信号。这样,我们就可以使用该类来实现数据模型中的通知机制。
要使用这个类,可以像下面这样实例化它:
```cpp
MyTemplateClass<int> intClass(42);
MyTemplateClass<QString> stringClass("Hello, World!");
QObject::connect(&intClass, &MyTemplateClass<int>::dataChanged, [](int newData) {
qDebug() << "New int data:" << newData;
});
QObject::connect(&stringClass, &MyTemplateClass<QString>::dataChanged, [](const QString& newData) {
qDebug() << "New string data:" << newData;
});
intClass.setData(43);
stringClass.setData("Hello, Qt!");
```
在这个示例中,我们分别实例化了两个 `MyTemplateClass` 对象,分别传递了 `int` 和 `QString` 类型的模板参数。我们还使用 `connect` 函数连接了 `dataChanged` 信号和一个 lambda 函数,以便在数据发生变化时接收通知。最后,我们调用 `setData` 函数来设置新的数据。当数据发生变化时,我们定义的 lambda 函数就会被调用。
当然,这只是一个简单的示例。您可以根据自己的需求来扩展这个类,以实现更复杂的功能。
阅读全文