清理Qt布局并添加其他小部件不起作用.幽灵小部件留下来.Qt错误
Cleaning a Qt layout and adding other widgets does not work. Ghost widgets stay. Qt bug?
我有一个包含项目的布局列表。它形成一个自定义表。
为了清理桌子,我遍历了所有布局并逐个取出项目。然后删除布局。
// Delete all items
QHBoxLayout* row = NULL;
while( !rowLyts_.isEmpty() && (row = rowLyts_.takeAt(0)) != 0 )
{
QLayoutItem *item;
while ((item = row->takeAt(0)) != 0)
delete item;
delete row;
}
这似乎有效。但是当我再次开始填满桌子时,我看到清洁前的物品的"幽灵"。大多数时候,它们位于新对象后面的线条之间。他们仍然有效。
当您仅将布局与小部件一起使用时,也会发生这种情况。
我只想在不删除内容小部件的情况下清理布局的整个布局。清洁布局的安全方法!
您正在删除布局项目,但不会删除这些项目用于管理的微件。您必须删除微件。删除布局本身时,将自动删除所有非布局项目。
QHBoxLayout* row;
while(!rowLyts_.isEmpty() && (row = rowLyts_.takeAt(0)))
{
QLayoutItem *item;
while ((item = row->takeAt(0))) {
// The item will be deleted when the layout itself is
// destructed. Items such as spacers will return a null
// widget, its deletion is a safe no-op.
delete item->widget();
// We don't handle recursion into sublayouts.
// We check for it so that we won't leak the layout.
Q_ASSERT(!item->layout());
}
delete row;
}
断言的存在是为了确保代码工作的布局与隐含的前提条件匹配:不得有子布局,因为编写的代码不会递归到它们中。任何子布局及其小部件都会泄漏(不是内存泄漏,而是资源泄漏)。如果违反前提条件,断言将中止执行。
清除布局可以通过以下方式完成:
QLayoutItem* item;
while ( ( item = row->takeAt( 0 ) ) != NULL )
{
delete item->widget();
delete item;
}
相关文章:
- Qt VTK交互风格的信号到小部件
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在QT中的自定义视频小工具t上绘制矩形
- 由于PC显示设置的更改,Qt小部件被部分剪裁
- 按钮悬停在 QT 中垂直布局的选项卡小部件中不起作用
- 有没有办法区分Qt小部件是通过鼠标单击还是通过按表键获得焦点?
- Qt PL/SQL - 赋值运算符 - 字符串缓冲区太小
- 如何使用MSVC 2019创建和使用Qt 5.14.0自定义小工具插件
- Qt:无法直接为带有子项的小部件添加滚动条
- 在Qt小部件应用程序中,在重载的"paintEvent"中的"setValue"
- 水平对齐动态创建的小部件QT C
- 在列表小部件 Qt C++中显示数组内容
- C++ 创建小部件数组
- 运行后台"algrothim"更新小部件Qt的最佳方式
- 动态和顺序命名和实例化小部件qt
- 构建最小的Qt控制台项目失败,出现神秘的链接器错误LNK2001:未解析的外部符号
- 总是关注隐藏的小工具?(Qt c++)
- 如何使缩进更小的qt工具提示与html清单格式
- 我拖放了一个Table View小部件(Qt).如何在填充元素后调整它的大小
- 删除指向小部件Qt C++的指针