无法从 QVBoxLayout 中删除自定义 QWidget
can't remove custom QWidget from QVBoxLayout
这是一个记录得相当好的问题,但经过一些阅读和尝试,我仍然很难从QVBoxLayout
中删除自定义小部件。
在MyClass.h
文件中,我声明了一个向量来保存QPointer
对象:
vector< QPointer<MyWidget> > myWidgets;
在MyClass.cpp
文件中,我正在创建小部件,并使用将其添加到布局中
// create object
void MyClass::createMyWidget() {
QPointer<MyWidget> myWidget(new MyWidget());
myWidgets.push_back(myWidget);
}
//display in layout
void MyClass::displayWidgets() {
for(int i = 0; i < myWidgets.size(); i++) {
myWidgets[i]->setId(i);
ui->myVBoxLayout->addWidget(myWidgets[i].data());
}
}
我尝试了以下方法从布局中删除小部件:
void MyClass::removeMyWidget(int id) { // id of the custom widget. id is also position in the layout
for(int i = 0; i < myWidgets.size(); i++) {
if(items[i]->getId() == id) { //correctly targets the widget
// method 1
ui->myVBoxLayout->removeItem(ui->myVBoxLayout->takeAt(i));
//method 2
//ui->myVBoxLayout->removeWidget(items[i]);
}
}
}
以上两种方法都不起作用,我也不知道为什么。
在Qt中,布局只是调整和定位小部件(以及其他项目,如嵌套布局或间隔符)的管理器。
从布局中删除项目时,它仍然是由布局布局的父小部件的子小部件,只是它的几何图形不再受管理。尽管如此,小部件仍然存在并显示,用户可以与之交互
你还必须删除或隐藏它。试试
void MyClass::removeMyWidget(int id){ // id of the custom widget. id is also position in the layout
for(int i=0;i<myWidgets.size();i++){
if(items[i]->getId() == id){ //correctly targets the widget
ui->myVBoxLayout->removeWidget(myWidgets[i]);
delete myWidgets[i]; // <= Delete widget
}
}
}
相关文章:
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何使用 C 指针的自定义删除器创建unique_ptr?
- 在地图中使用自定义删除器存储unique_ptr
- 在 C++ 的自定义运算符中删除与删除[](不同于常见的删除与删除[]问题)
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- 在unique_ptr<>中使用自定义删除程序 (curl_formfree())
- C++自定义删除运算符不能正常工作?
- 从自定义数据类型向量中删除重复元素
- shared_ptr的删除程序是否存储在自定义分配器分配的内存中?
- 如何删除Qt设计器中自定义插件的QString属性的"translatable"复选框?
- 如何在我的类unique_ptr中提供自定义删除器?
- 无法使用带有 std::move 的自定义删除器插入 std::unique_ptr
- 未调用 std::unique_ptr 中的自定义删除器
- C++ priority_queue与自定义比较器并删除任何项目
- 如何在不使用 vector::erase() 的情况下编写自定义 Vector 方法来删除元素?
- 在 QLayout 中创建和删除自定义 QWidgets 时出现 RAM 问题
- 无法删除自定义类的堆实例 (C++)
- 无法从 QVBoxLayout 中删除自定义 QWidget
- 删除自定义双链表
- 如何在gtkmm中删除自定义TreeModel中的user_data