堆栈与堆属性的 QT 特定差异?

2023-12-12

通常,在编写 C++ 代码时,我会始终将对象保留为普通属性,从而利用 RAII。然而,在 QT 中,删除对象的责任可以由析构函数承担QObject。因此,假设我们定义了一些特定的小部件,那么我们有两种可能性:

1)使用QT的系统

class Widget1 : QWidget
{
Q_OBJECT
public:
    Widget1(QWidget* parent = nullptr);

private:
    QPushButton* myButton; // create it with "new QPushButton(this);"
};

2)使用RAII

class Widget2 : public QWidget
{
Q_OBJECT
public:
    Widget2(QWidget* parent = nullptr);

private:
    QPushButton button; // normal RAII
};

通常,我使用第一种方法。看起来某物如果父级不仅仅通过布局来了解其子级,那么效果会更好。但仔细想想……真正的原因我却不太清楚。

我知道堆栈是有限的。但我们可以说这在这里不起作用。毕竟堆栈不是that small.


看起来某物如果父级不仅仅通过布局来了解其子级,那么效果会更好。

你是对的。 AQObject的parent不仅用于内存管理目的,这个答案总结了它的一些其他用法。这里最重要的是QWidget的(因为您担心添加成员QWidget's),所以如果您按照编写的方式使用第二种方法,您可能会遇到以下一些问题:

  • 假设你正在实例化Widget1并将其显示在您的主函数中,如下所示:

    Widget1 w;
    w.show();
    

    这将显示一个空的小部件,其中没有按钮。与以下行为相反button是 的孩子Widget1对象,在哪里调用show()显示小部件父级及其所有子级。

    使用时出现类似问题setEnabled(), setLayoutDirection(), ...

  • button.pos()不会返回相对于的坐标Widget1,事实上该按钮甚至没有显示在其中。使用时同样问题move().

  • 事件系统可能无法按预期工作。因此,如果成员小部件不处理某些鼠标/键盘事件,则该事件不会传播到parent小部件(因为没有指定父级)。

但是可以编写第二种方法来利用与 RAII 的父母关系,这样就避免了上述问题:

class Widget2 : public QWidget
{
public:
    explicit Widget2(QWidget* parent = nullptr):QWidget(parent){}

private:
    QPushButton button{this}; //C++11 member initializer list
};

或者,在 C++11 之前的版本中:

class Widget2 : public QWidget
{
public:
    //initialize button in constructor, button's parent is set to this
    explicit Widget2(QWidget* parent = Q_NULLPTR):QWidget(parent), button(this){}

private:
    QPushButton button;
};

这样,两种方法之间的 Qt 框架就没有任何差异。实际上,使用第二种方法可以避免不必要时的动态分配(请注意,如果例如在某些嵌套循环中非常频繁地执行分配,这可能会具有稍好的性能。但是,对于大多数应用程序来说,性能在这里并不是真正的问题)。因此,您可能会像这样编写小部件:

class Widget : public QWidget
{
public:
    explicit Widget(QWidget* parent = nullptr):QWidget(parent){
        //add widgets to the layout
        layout.addWidget(&button);
        layout.addWidget(&lineEdit);
        layout.addWidget(&label);
    }
    ~Widget(){}

private:
    //widget's layout as a child (this will set the layout on the widget)
    QVBoxLayout layout{this};
    //ui items, no need to set the parent here
    //since this is done automatically in QLayout::addWidget calls in the constructor
    QPushButton button{"click here"};
    QLineEdit lineEdit;
    QLabel label{"this is a sample widget"};
};

这很好,有人可能会说这些子部件/对象将被销毁两次,第一次是当它们超出范围时,第二次是当它们的父级被销毁时,使得该方法不安全。这是not一个问题是,一旦子对象被销毁,它就会从其父对象的子对象列表中删除自己,请参阅docs. So, 每个对象都会被销毁一次.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

堆栈与堆属性的 QT 特定差异? 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 网格列在动画时改变宽度

    我有一个具有两列和三行的网格元素 最后一行的高度为 0 并且我使用自定义动画类对 height 属性进行动画处理 因为 gridheight 属性不是整数 动画工作得很好 但是当我激活它时 它似乎随机地改变了第二列的宽度 有时只是大几个像素
  • MYSQL - 在数据库之间复制具有特定前缀的表

    是否有一个 SQL 命令可以复制许多具有特定前缀的表 即yot 两个 MYSQL 数据库之间 DB用户可以访问这两个DB 没有任何类型的 SQL 语句使用通配符对表进行操作 您必须明确命名表 但是 您可以generate通过查询 INFOR
  • Mockito 模拟 SecurityManager 抛出异常

    我试图嘲笑SecurityManager班级 当我运行以下代码时 Mockito 抛出异常 After public void tearDown SecurityManager securityManagerMock mock Securi
  • Android MediaPlayer 是多线程的吗?

    我们可以从后台线程创建和使用 Android MediaPlayer 吗 我问是因为奇怪的是所有回调事件 例如OnError OnPrepared OnVideoSizeChanged等 在主 UI 线程中触发 即使 MediaPlayer
  • 如何将尾随返回类型与模板化类成员一起使用

    我正在尝试实现以下课程 template
  • 制作 pdf 时无法让 CSS 在 iTextSharp (5.4.3) 中工作

    我在尝试使用 iTextSharp 5 4 3 生成库将 css 文件应用到我的 pdf 时遇到问题 基本上CSS根本没有被应用 我的 vb net 文件中有以下方法 Protected Sub btnPreview Click ByVal
  • 对 virtualenv 使用单个站点包(作为例外)

    在 virtualenv 中 我怎样才能忽略no site packages单个包的规则 一些背景 我使用 virtualenv 进行部署 但自从我使用以来 这些需要更长的时间lxml 每次我重新安装新的 virtualenv 时 编译此文
  • PHP shell_exec,执行 -rwxrwxrwx shell 脚本的权限被拒绝

    我目前在运行 Apache Web 服务器的远程 CentOS 5 6 系统上通过 ssh 进行连接 我需要使用 popplerpdftohtml不幸的是 该二进制文件当前尚未安装在该计算机上 所以我下载了 poppler 包并将其构建在我
  • 如何通过 IDE(Netbeans、Eclipse)中的 optirun (Bumblebee) 运行使用图形驱动程序的构建?

    有谁知道如何通过在IDE中调用optirun bumblebee 来使eclipse或netbeans使用optimus笔记本电脑中的显卡 以便只需使用IDE中的运行按钮即可在IDE中的显卡中运行程序 以最简单的形式 我只希望 IDE 执行
  • 在 iframe 内使用 angularjs 变量

    所以我想在 iframe src 或 ng src 属性内使用变量 显然 无论我使用什么 我的变量都没有被识别 例如 其中测试只是显示为 test 另外当我使用 sce要将其用作受信任的 url 它不起作用 普通 src 也是如此 有什么我
  • NetUserAdd - 权限问题,参数不正确

    我在用着网络用户添加添加新管理员 但我收到一个我无法弄清楚的错误 失败方法返回的错误是 NET API STATUS 87 PARAM ERR 5 The NET API STATUS有一个价值87这是ERROR INVALID PARAM
  • 为什么我不能使用列表迭代器逻辑比较运算符?

    这是非常基本的 但我在这里找不到类似的问题 我正在尝试使用 list 从不同方向迭代相同的排序 STL 列表 我知道我可以将迭代器与list begin and list end 那么为什么这不起作用呢 list
  • 将项目垂直排列在行/列中,而不是水平排列

    我正在创建一个 html 页面 并希望切换到页面的滚动和浮动 所以在 body 或 div 中我想要一个项目列表 每个项目都应该位于前一个项目的下方 除非触及 div 的末尾 然后它应该位于较高的部分 依此类推 因此 如果要显示的内容太多
  • 在 PHP 会话中存储对象

    PHP 文档说 您不能在会话变量中使用引用 因为没有可行的方法来恢复对另一个变量的引用 这是否意味着我不能拥有类似的东西 session start user new User user gt name blah SESSION user
  • 透明 Bootstrap 导航栏

    我正在开发一个网站 我希望导航 仅主页 是透明的并且图像覆盖全屏 这是我到目前为止所拥有的 导航栏采用这种方式设计 因为其他页面上也是如此 这是我的 HTML div class container fluid div
  • 按方案中对的第二个元素对对列表进行排序

    我在方案中有一个程序 它给我一个对的列表 我需要按对的第二个元素对该列表进行降序排序 像这样 1 1 2 3 3 2 gt 2 3 3 2 1 1 1 1 x 3 2 1 3 1 gt x 3 1 1 2 1 3 1 1 3 3 4 2 2
  • Pyspark - df.cache().count() 需要永远运行

    我正在尝试使用我在网上阅读的计数方法强制对 PySpark 进行热切评估 spark df spark read jdbc url jdbcUrl table pushdown query properties connectionProp
  • 高效批量更新rails数据库

    我正在尝试构建一个 rake 实用程序 它会经常更新我的数据库 这是我到目前为止的代码 namespace utils do utils update ip Downloads the file frim
  • .Net“任何框架”配置

    我用 C NET 2 0 构建了一个程序 该程序在框架 3 0 和 3 5 下也能很好地工作 但如果 NET Framework 4 0是唯一安装的框架 则它不起作用 需要用户安装2 0 我在google中找到了以下配置
  • 堆栈与堆属性的 QT 特定差异?

    通常 在编写 C 代码时 我会始终将对象保留为普通属性 从而利用 RAII 然而 在 QT 中 删除对象的责任可以由析构函数承担QObject 因此 假设我们定义了一些特定的小部件 那么我们有两种可能性 1 使用QT的系统 class Wi