2013-09-21 47 views
5

Tôi có một QVBoxLayout bên trong một scrollArea. Tôi tự động thêm QFormLayout s.Xóa tất cả trẻ em khỏi QVBoxLayout

widgetTreeStruct* tree = new widgetTreeStruct(QString::number(numberOfGraphs)); 
QFormLayout* layout = tree->getTree(); // get QFormLayout 
ui->verticalLayout_2->addLayout(layout); //add to the vertical layout 

Tại một thời điểm, tôi cần xóa tất cả số QFormLayouts được thêm vào từ QVBoxLayout.

Tôi đã thử một số cách để thực hiện việc này.

  1. Sử dụng qDeleteAll()

qDeleteAll(ui->verticalLayout_2->children());

2.delete mục từng người một

QLayoutItem* child; 
      while((child = ui->verticalLayout_2->takeAt(0)) != 0) 
      { 
       if(child->widget() != 0) 
       { 
        delete child->widget(); 
       } 

       delete child; 
      } 

Nhưng không có gì xảy ra. Chỉ có điều là khi tôi cố gắng để thêm các mục vào QVBoxLayout một lần nữa các mục mới được thêm vào đầu của các mục được thêm trước đó.

After added items to QVBoxLayout

Tôi cảm thấy rằng tôi phải vẽ lại, sơn lại, cập nhật, làm mới hoặc một cái gì đó. Tôi đã thử ui->verticalLayout_2->update(); nhưng không hoạt động đối với tôi.

Vì vậy, tôi nên làm gì?

Trả lời

7

Tôi đệ quy xóa tất cả các trẻ em và nó hoạt động cho tôi.

Đây là mã của tôi.

void Widget::remove(QLayout* layout) 
{ 
    QLayoutItem* child; 
    while(layout->count()!=0) 
    { 
     child = layout->takeAt(0); 
     if(child->layout() != 0) 
     { 
      remove(child->layout()); 
     } 
     else if(child->widget() != 0) 
     { 
      delete child->widget(); 
     } 

     delete child; 
    } 
} 

remove(ui->verticalLayout_2); 
+0

Đây là, trên thực tế, * cách * chính xác để thực hiện. +1 –

1

Có lẽ cha mẹ của tiện ích con là phụ tùng có chứa , không phải bố cục của chúng (thông tin được hiển thị cho thông số parent?).

Có thể QObject::dumpObjectTree() có thể giúp bạn hiểu mối quan hệ cha-con.

Điều gì sẽ xảy ra với cách tiếp cận của bạn 2 (không phụ thuộc vào các tiện ích con là QObject -sense bố cục) là nó xóa tất cả các mục khỏi bố cục với phương pháp takeAt() nhưng không xóa chúng. của toplevel QVBoxLayoutQFormLayout s, do đó, hãy gọi widget() trên số QLayoutItems trả về 0. Chỉ cần sử dụng delete child vô điều kiện để xóa con QLayout s. Tuy nhiên, điều này vẫn không xóa các tiện ích con . Bạn có thể gọi một cách đệ quy takeAt() trên bố cục con hoặc xóa tất cả các con của tiện ích con (QScrollArea) hoặc tự giữ danh sách tiện ích và/hoặc bố cục.

+0

Khi tôi thử xóa tất cả các trẻ khỏi 'QVBoxLayout' và thêm tiện ích con khác vào' QVBoxLayout' một lần nữa, tôi có thể thấy tiện ích con mới xuất hiện ở đầu các tiện ích trước. Điều đó cho thấy các widget thực sự là con của 'QVBobLayout' và thực ra chúng đã bị xóa. Đúng? Nhưng điều duy nhất là họ cần phải xóa hoặc ẩn khỏi cửa sổ. Hãy sửa tôi nếu tôi sai. –

+0

Chúng không bị xóa, chỉ bị xóa khỏi bố cục vì bạn sử dụng 'widget()'. Xem chỉnh sửa của tôi ở trên. – Oberon

Các vấn đề liên quan