Qt5.15.2 C++ 在一个 .h 头文件中定义多个类
MyClasses.h
#ifndef MYCLASSES_H
#define MYCLASSES_H
#include <QObject>
#include <QString>
// 第一个类:继承自 QObject,使用 Q_OBJECT 宏
class MyClassA : public QObject
{
Q_OBJECT
public:
explicit MyClassA(QObject *parent = nullptr);
QString getName() const;
public slots:
void setName(const QString &name);
signals:
void nameChanged(const QString &newName);
private:
QString m_name;
};
// 第二个类:普通 C++ 类(不继承 QObject)
class MyClassB
{
public:
MyClassB(int value = 0);
int getValue() const;
void setValue(int value);
private:
int m_value;
};
// 第三个类:另一个 QObject 子类
class MyClassC : public QObject
{
Q_OBJECT
public:
explicit MyClassC(QObject *parent = nullptr);
void doSomething();
signals:
void somethingDone();
};
#endif // MYCLASSES_HMyClasses.cpp
#include "MyClasses.h"
#include <QDebug>
// MyClassA 实现
MyClassA::MyClassA(QObject *parent)
: QObject(parent), m_name("Default")
{
}
QString MyClassA::getName() const
{
return m_name;
}
void MyClassA::setName(const QString &name)
{
if (m_name != name) {
m_name = name;
emit nameChanged(m_name);
}
}
// MyClassB 实现
MyClassB::MyClassB(int value)
: m_value(value)
{
}
int MyClassB::getValue() const
{
return m_value;
}
void MyClassB::setValue(int value)
{
m_value = value;
}
// MyClassC 实现
MyClassC::MyClassC(QObject *parent)
: QObject(parent)
{
}
void MyClassC::doSomething()
{
qDebug() << "Doing something...";
emit somethingDone();
}注意事项:
每个使用
Q_OBJECT宏的类:必须继承自
QObject(直接或间接)。必须单独声明,不能嵌套在其他类内部(除非是嵌套但不使用信号/槽)。
需要被 MOC(Meta-Object Compiler)处理。Qt 的构建系统(qmake 或 CMake)会自动处理包含
Q_OBJECT的头文件。头文件防护(Include Guards):
使用
#ifndef / #define / #endif防止重复包含。也可以用
#pragma once(大多数现代编译器支持),但在跨平台项目中传统写法更稳妥。命名规范:
类名应清晰、唯一,避免冲突。
如果类之间关系紧密(如一个主类 + 若干辅助类),放在一起是合理的;否则建议拆分到不同文件以提高可维护性。
MOC 兼容性:
所有带
Q_OBJECT的类必须在头文件中定义(不能只在.cpp中),因为 MOC 需要解析头文件。
目录 返回
首页