2

QGridLayoutカスタムを追加する場所がありますQWidgets

それらをすべて削除しようとすると、おそらくレイアウトから削除されますが(関数layout.count()が0を返すため)、それらは引き続きインターフェイスに表示され、操作できます。

ここに、ウィジェットを追加する方法があります。

void MyClass::addCustomWidget(CustomWidget *_widget, int r, int c)
{
    layout->addWidget(_widget, r, c);
    _widget->show();
}

そして、ここで私がそれらを削除する方法:

void MyClass::clearLayout()
{
    qDebug() << "Layout count before clearing it: " << layout->count();

    int count = layout->count();
    int colums = layout->columnCount();
    int rows = layout->rowCount();

    int i=0;
    for(int j=0; j<rows; j++)
    {
        for(int k=0; k<colums && i<count; k++)
        {
            i++;

            qDebug() << "Removing item at: " << j << "," << k;
            QLayoutItem* item = layout->itemAtPosition(j, k);

            if (!item) continue;

            if (item->widget()) {
                layout->removeWidget(item->widget());
            } else {
                layout->removeItem(item);
            }
            qDebug() << "Removed!";
        }
    }

    qDebug() << "Layout count after clearing it: " << layout->count();
}

QGridLayoutからアイテム/ウィジェットを正しく削除するためのヘルプやヒントはありますか?

PD:インターネットで、多くの人がレイアウトからウィジェットを削除した後、ウィジェットを直接削除する(delete _widget)ことを確認しました。私の場合、そのウィジェットをメモリに保持する必要があるため、それは不可能です。

4

5 に答える 5

3

deleteLater()反復中に子の数を維持する際の問題を回避するために使用することもできます。

for (int i = 0; i < gridLayout.count(); i++)
{
   gridLayout.itemAt(i)->widget()->deleteLater();
}
于 2017-03-12T10:35:02.637 に答える
2

ただ明確にします。ウィジェットを「削除」していません。それらをレイアウトから削除しただけです。レイアウトからの削除は、ウィジェットがこのレイアウトによって管理 (サイズ変更/配置) されなくなることのみを意味しますが、ウィジェットが (C++ の方法で) 「削除」されることを意味するわけではありません。また、ウィジェットは魔法のように非表示になりません。レイアウトから削除した後も、ウィジェットは作成/管理されたウィジェットに残ります。したがって、このレイアウトの所有者は、このウィジェットを子 (可視の子) として保持しています。

必ず

  1. ウィジェットを非表示にするか、もう使用しないことが確実な場合

  2. 「delete」キーワードでウィジェットを削除

また、呼び出す必要はありませんremoveWidget(item->widget())removeItem(item)すべてのレイアウト アイテムに十分です (内部にウィジェットがある場合でも)。

于 2012-05-23T08:44:00.840 に答える
1

試す

QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0);

安全なはずです。何らかの理由で機能しない場合は、ウィジェットを追加するたびに更新されるウィジェットまたはレイアウト項目のコレクションを使用できます。次に、コレクションをループして削除し、レイアウトから各要素を削除します。

于 2012-05-23T08:44:13.383 に答える
0
Header:
class Grid : QGridLayout
{
public:
    Grid(QWidget* parent);
    void addElement(QWidget* element, int x, int y);
    void delElement(int x, int y);
    void resize(int width, int height);
    void clear();
protected:
    QSize size;
};

void Grid::clear(){
    for(int i = 0;i<size.width();i++){
        for(int j = 0;j<size.height();j++){
            QLayoutItem* item = takeAt(i*size.width() + j);
            if(item != NULL) delete item;
        }
    }
}
于 2014-02-27T10:10:28.950 に答える