惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
云风的 BLOG
云风的 BLOG
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
C
Check Point Blog
M
MIT News - Artificial intelligence
T
The Blog of Author Tim Ferriss
Jina AI
Jina AI
博客园 - 【当耐特】
U
Unit 42
月光博客
月光博客
腾讯CDC
Y
Y Combinator Blog
小众软件
小众软件
博客园_首页
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
The GitHub Blog
The GitHub Blog
博客园 - 聂微东
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
T
Tailwind CSS Blog

Qt

撸了一个面向 Qt Widgets 的 Fluent 风格组件库 请问一下大家用 ai 做 qt 应用的时候有什么 skill 或者方法改进 ui 吗? qt 新手求助: No documents matching 'ui_mainwindow.h' could be found 请教几个 qt6, macos 打包遇到依赖问题。 新建一个 qt 项目,运行时,底下应用程序输出 1127, FromFilemap Qt5 托盘菜单右击时的异常 有没有什么工具可以美化 qt 界面的? Qt 有什么不错的第三方控件库吗? 寻求帮助!在 qt creator 里面创建 quick 项目失败,找不到原因。 关于 QT 中通过信号与槽的方式启动子线程的问题。 寻找一起开发这个开源项目的人, qt c++的,信息收藏、Kindle/微信读书/豆瓣阅读笔记管理 使用 Qt 做的软件界面太丑怎么办?有没有什么美工插件或者入门教程 有哪位大佬对修改 3DSlicer 或者开发插件有经验? 如何正确安装 QT? 请教 qt svg 打包后无法显示问题。 如何在 QT 中的多个级别的窗口之间传输消息 关于 QT(C++)通过继承 QObject 的方法实现多线程,子线程调用失效。 qt5 中文乱码问题怎么解决? 现在写 Qt 的主流 IDE 工具是什么? 请问多线程之间是如何协调配合的? QSerialPort 如何实现同一个串口设备命令做出不同操作? qt creator 插件开发问题请教 求助一个读硬盘序列号的问题 关于 Qt6.6.0 无法设置程序图标的问题 求助,如何编译 openwrt 的时候加入 qt6 为什么 Qt Creator 界面如此丑陋 大家了解 Qt 和 qt-creator 的开源协议吗?基于它,可以写闭源商用的软件吗? 求助,使用 CLion 开发 Qt,创建了 UI 类不会使用 mac 下的 Qt/C++应用,通过 url scheme 唤起时,如何获取到唤起的链接? Qt 中的 `QFontMetrics.boundingRect()` 算出来的文本长度有时候会不对,应该如何处理。
在 Qt 中控件同时使用智能指针和父子关系,会有二次删除风险吗?
WangLiCha · 2024-07-05 · via Qt

比如一个像下面这样定义的 QDialog 窗体:

#ifndef PLAYDIALOG_H
#define PLAYDIALOG_H

#include <memory>
#include <QVBoxLayout>
#include <QDialog>

class QPushButton;

class PlayDialog : public QDialog
{
    Q_OBJECT
public:
    explicit PlayDialog(QWidget* parent = nullptr);

private:
    QVBoxLayout* m_layout;

    QPushButton* m_button1;
    std::shared_ptr<QPushButton> m_button2;
    QSharedPointer<QPushButton> m_button3;
};

#endif // PLAYDIALOG_H

#include "playdialog.h"

#include <memory>
#include <QDialog>
#include <QLayout>
#include <QPushButton>
#include <QVBoxLayout>

PlayDialog::PlayDialog(QWidget* parent) : QDialog(parent), m_layout(new QVBoxLayout(this))
{

    m_button1 = new QPushButton("BUTTON1", this);
    m_button2 = std::make_shared<QPushButton>("BUTTON2", this);
    m_button3 = QSharedPointer<QPushButton>::create("BUTTON3", this);

    m_layout->addWidget(m_button1);
    m_layout->addWidget(m_button2.get());
    m_layout->addWidget(m_button3.get());

    setLayout(m_layout);
}

其中的 QPushButton 都设置了 QDialog 窗体为父控件,m_button2m_button3分别用 C++原生和 Qt 的智能指针进行了包装。如果这个时候关掉父窗体,因为父子级关系三个按钮都会被释放,但是受智能指针管理的m_button2m_button3按理说也会被释放,这种时候会存在二次删除风险吗?是不是在 Qt 中不应该用智能指针管理设置了父子级关系的 QWidget 控件?还是说 Qt 封装过的 QSharedPointer 可以放心使用?