5

私はについて非常に基本的な疑問を持っていQGridLayoutます。にウィジェットを追加するには、 &no(他の引数も)と一緒にウィジェットを追加するQGridLayout必要があります。ウィジェットを削除するために、行と列に応じてウィジェットを削除する機能はありません。つまり、次のようなものはありません。QWidget *rowcolumn

int row, column;
gridObj->remove(row, column);

ウィジェットとそこの位置の参照を保存QGridLayoutするための一種を維持しているに違いないと思います。では、なぜ位置だけでウィジェットを削除する機能がないのでしょうか。オブジェクトの参照を指定する必要があるremove関数は1つだけです。QListQWidget

これが何らかの理由で制限である場合、この問題の回避策はありますか?自分でQListを維持することは解決策ですが、かなり面倒です。ありがとうございました

4

2 に答える 2

5

私はここで間違っているかもしれませんが、ドキュメントをざっと読んで、これを試してください:

  1. 位置(QGridLayout :: itemAtPosition(row、column))でQLayoutItemを取得します。
  2. QLayoutItemを使用して、ウィジェットポインターを取得します(QLayoutItem :: widget())。
  3. ウィジェットポインターを使用して、QGridLayout(QLayout :: indexOf(widgetPointer))でウィジェットのインデックスを検索します。
  4. インデックスを使用して、レイアウトからウィジェットの所有権を取得します(QGridLayout :: takeAt(インデックス))。
  5. すべてを便利な機能でラップしますか?

レイアウト内のウィジェットの並べ替え、レイアウトからのウィジェットの削除などにいつも問題がありました。多くの場合、レイアウトを削除してウィジェットを再度追加するだけです。=(

于 2013-03-23T16:31:27.303 に答える
4

レイアウト位置によってQGridLayout内のウィジェットを削除するには、次を使用できます。

layout->removeWidget(layout->itemAtPosition(row, column)->widget());

ただし、次の点に注意する必要があります。

  • このコードは、レイアウト内の指定された位置に実際にアイテムがあることを前提としています。そうでない場合、itemAtPosition()はnullを返します。したがって、位置を確認するか、明示的に確認する必要があります。
  • このコードは、ウィジェットをレイアウトから削除しますが、削除はしません。ウィジェットを別のレイアウトに戻すか、ウィジェットに適切なジオメトリを自分で与える必要があります。そうしないと、ウィジェットは単に現在の位置に表示されたままになります。ウィジェットを破棄する場合は、レイアウトから削除した後で明示的に削除する必要があります。
  • このコードは、で追加されたレイアウト内のトップレベルウィジェットに対してのみ機能しますaddWidget()。で追加されたネストされたレイアウトでは機能しませんaddLayout()。ネストされたレイアウトも気にする必要がある場合は 、グリッドレイアウトからの行と列の削除に関する私の回答を参照してください。
于 2013-10-08T20:32:48.310 に答える