当前位置: 首页 > wzjs >正文

云南哪有网站建设报价的南宁营销型网站建设哪家好

云南哪有网站建设报价的,南宁营销型网站建设哪家好,网站建设相关博客,怎么样做网站才能适应手机屏幕【Qt】Qt 类的继承与内存管理详解:QObject、信号槽与隐式共享 ​ 在刚开始开发中,想当然的以为Qt的类都是继承自QObject其实不是。导致有时候写的一个继承自比如QGraphicsRectItem的自定义类,不能使用信号槽,但是发现加了Q_OBJEC…

【Qt】Qt 类的继承与内存管理详解:QObject、信号槽与隐式共享

​ 在刚开始开发中,想当然的以为Qt的类都是继承自QObject其实不是。导致有时候写的一个继承自比如QGraphicsRectItem的自定义类,不能使用信号槽,但是发现加了Q_OBJECT宏 但是还是报错;最后发现应该这样写就可以了。

class GameItem : public QObject, public  QGraphicsRectItem {//必须把 QObject 放在第一位继承,否则会导致 moc 解析失败!Q_OBJECT
public:
};

在 Qt 中,并不是所有的类都继承自 QObject。通常,Qt 中的类可以分为两大类:

  1. 继承 QObject 的类 → 这些类支持信号槽、对象树管理、属性系统等。
  2. 不继承 QObject 的类 → 这些类通常是轻量级的数据类、图形类,或者需要频繁拷贝的类。

1. 继承 QObject 的类(支持信号槽)

这些类通常是 管理对象、UI 组件、后台服务 等,主要用于事件驱动编程

🔹 典型的继承 QObject 的类

类名作用
QObject所有 QObject-based 类的基类
QApplication / QGuiApplication应用程序管理
QWidget所有 UI 界面组件的基类
QMainWindow / QDialog / QLabel窗口组件
QPushButton / QLineEdit / QTextEdit常见 UI 控件
QThread线程管理
QTimer定时器
QNetworkAccessManager网络请求
QAbstractItemModel / QStandardItemModelMVC 数据模型
QGraphicsObject继承 QObjectQGraphicsItem(可以用信号槽)

QWidgetQObject 的子类,所以所有 UI 控件(QPushButtonQLabel 等)都能用信号槽!


2. 不继承 QObject 的类(不支持信号槽)

这些类主要是 数据结构、数学运算、图形元素,它们需要 支持拷贝、性能优化,因此 不能继承 QObjectQObject 禁止拷贝)。

🔹 典型的不继承 QObject 的类

类别代表类说明
数据结构QString / QByteArray / QVariant / QList / QMap这些类是 Qt 提供的基本数据类型
几何类QPoint / QRect / QSize / QColor表示点、矩形、大小、颜色
绘图类QImage / QPixmap / QPainter用于绘图、图像处理
模型-视图框架QModelIndex / QItemSelectionMVC 相关类
多线程QMutex / QWaitCondition线程同步工具
图形视图框架QGraphicsItem / QGraphicsRectItem / QGraphicsPixmapItem这些类用于 QGraphicsScene,但不继承 QObject
是否继承 QObject类的分类示例
✅ 继承 QObject事件管理QApplication / QWidget / QThread / QTimer
✅ 继承 QObjectUI 控件QPushButton / QLabel / QLineEdit
✅ 继承 QObject网络通信QNetworkAccessManager
❌ 不继承 QObject数据类QString / QByteArray / QList
❌ 不继承 QObject图形类QGraphicsItem / QImage / QPixmap
❌ 不继承 QObject几何类QPoint / QRect / QSize
❌ 不继承 QObject线程同步QMutex / QWaitCondition

是的,QStringQByteArrayQListQt 容器类和一些值类型 不需要手动 delete,因为它们采用了 值语义(Value Semantics),不需要显式管理内存。


3. 既然QString不是继承QObject,关于内存管理的一点疑问。

1. 为什么 QString / QByteArray / QList 不需要 delete

这些类都不是指针对象,而是基于 C++ 值语义(Value Semantics),它们的内存管理是 RAII(Resource Acquisition Is Initialization) 风格的。对象离开作用域时,会自动释放内存,不需要 delete

✅ 正确示例:普通栈对象

QString str = "Hello, Qt!";
QByteArray data = "12345";
QList<int> list = {1, 2, 3, 4, 5};
// 离开作用域时,它们会自动释放

❌ 错误示例:动态创建但没 delete(不推荐!)

QString* str = new QString("Hello, Qt!");
// 这样的话,str 不会自动释放,会造成内存泄漏

💡 解决方案

  1. 不用 new,直接用栈对象(推荐!)
  2. 如果必须 new,要手动 delete
QString* str = new QString("Hello, Qt!");
delete str;  // 需要手动释放
  1. 使用智能指针
std::unique_ptr<QString> str = std::make_unique<QString>("Hello, Qt!");
// `std::unique_ptr` 会在作用域结束时自动释放

2. 这些类的内存是如何管理的?

QStringQByteArrayQList 等 Qt 容器类,底层使用了隐式共享(Copy-on-Write,COW)技术,使得它们在赋值和拷贝时效率更高。

✅ 隐式共享示例

QString str1 = "Hello";
QString str2 = str1;  // 这里不会真的拷贝数据,而是共享同一块内存str2.append(", Qt!");  // 只有这里修改了数据,Qt 才会创建新的副本

📌 特点

  • str2 赋值时,不会立即拷贝数据,而是共享 str1 的数据(只增加引用计数)。
  • 只有当 str2 被修改时,才会触发真正的拷贝,这样提高了性能。

3. QList 内部存储的指针怎么办?

虽然 QList<int> 这样的容器不需要 delete,但如果 QList 存的是指针,还是要手动释放指针对象**:

✅ 正确示例:存储对象(不需要 delete

QList<QString> strList;
strList.append("Item 1");
strList.append("Item 2");
// strList 离开作用域时,会自动释放

❌ 错误示例:存储指针但不释放(会内存泄漏)

QList<MyObject*> objList;
objList.append(new MyObject());
objList.append(new MyObject());// 这里如果不 `delete`,会内存泄漏!

💡 正确做法:遍历删除指针

for (MyObject* obj : objList) {delete obj;
}
objList.clear();

或者使用智能指针:

QList<std::unique_ptr<MyObject>> objList;
objList.append(std::make_unique<MyObject>());
objList.append(std::make_unique<MyObject>());
// `unique_ptr` 会自动管理内存,无需手动 `delete`
Qt 类是否继承 QObject是否需要 delete管理方式
QString❌ 否❌ 否值语义,自动释放
QByteArray❌ 否❌ 否值语义,自动释放
QList<int>❌ 否❌ 否值语义,自动释放
QList<MyObject*>❌ 否✅ 需要存的是指针,需要手动 delete
QObject✅ 是❌ 否(如果有 parentQt 父子对象管理
QGraphicsItem❌ 否✅ 需要QGraphicsScene 或手动 delete

✅ 重点:

  1. QString / QByteArray / QList 这些是值类型,不需要 delete,可以直接使用栈变量。
  2. 如果 QList 里存的是指针,一定要记得 delete,或者使用 std::unique_ptr 来自动管理内存。
  3. Qt 容器类使用了隐式共享(COW),所以赋值不会立即复制数据,只有在修改时才会真正拷贝。
http://www.dtcms.com/wzjs/706855.html

相关文章:

  • 自己公司做网站电子商务网站建设课设
  • 单位网站建设的重要性免费的企业网站模板
  • 网络推广外包哪个公司做的比较好全网seo优化电话
  • 侯马建设规划局网站成都 网页设计 兼职
  • 做外贸网站怎么做企业网络平台建设
  • 做a的视频在线观看网站蜘蛛网是个什么网站
  • 做外链那些网站比较好sem是什么意思?
  • 官方网站开发制作山东济南网站制作优化
  • 做网站有自己的服务器杭州建站模板展示
  • 专门做情侣装的网站五大建设是什么内容
  • 网站建设需要多少钱小江网页设计简述搜索引擎优化
  • DW做网站下拉列表怎么做如何给网站弄ftp
  • 深圳网站建设黄浦网络能带描文本外链的网站
  • 域名哪个网站好中国十大外贸上市公司排名
  • 运城建设局网站申请自己邮箱域名
  • 苏州专业做网站比较好的公司新媒体是什么
  • 网站设计制作合同范本做一个网站指定页面的推广
  • 网站制作价格报表企业培训课程一览表
  • 征婚网站上拉业务做恒指期货策划一场网络营销活动
  • 做律师网站推广优化哪家好免费源码大全
  • 网站模板 数据库郑州新闻发布会最新消息今天视频
  • 淘宝客不建立网站怎么做南宁的网站建设
  • 北辰做网站的公司sae wordpress 升级
  • 学做网站需要文化嘛wordpress微博登陆
  • 商丘云网广告有限公司绍兴seo公司
  • 自己站网站皮具网站建设
  • 安县建设局网站全网营销式网站
  • 网站建设柒首先金手指8桥头东莞网站建设
  • 延吉网站建设多少钱二次开发源代码
  • 中国搜索提交网站wordpress自定义页面分页