2013-03-23 66 views
3

我對QGridLayout有一個非常基本的疑問。 要添加一個小工具在QGridLayout我們給QWidget *,應該與row & column否(一些其他參數)一起添加。 現在用於去除小部件存在於沒有功能刪除根據一個widget來排&列中沒有即是這樣的:在Qt中從QGridLayout中移除Widget?

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

我覺得QGridLayout必須保持某種QList存儲的Widgets 引用&有職位。那麼爲什麼沒有按位置刪除小工具的功能呢? 它只有1個刪除功能,我們需要指定QWidget對象的引用。

如果這是某種限制,那麼是否有解決此問題的方法? 自己維護一個QList是一個解決方案,但它非常乏味。 謝謝

+0

首先,爲什麼你沒有任何指針創建小工具? – Blood 2013-03-23 16:21:17

回答

1

我可能會在這裏錯了,可是從略讀文檔,試試這個:

  1. 獲取QLayoutItem在位置(QGridLayout::itemAtPosition(行,列))。
  2. 使用QLayoutItem獲取小部件指針(QLayoutItem::widget())。
  3. 使用小部件指針來查找QGridLayout中小部件的索引(QLayout::indexOf(widgetPointer))。
  4. 使用索引從佈局中獲取窗口小部件的所有權(QGridLayout::takeAt(索引號))。
  5. 把它全部包裝在一個方便的功能?

我一直很難在佈局中重新排序窗口小部件,從佈局中刪除窗口小部件等等。通常,我只是求助於刪除佈局並重新添加窗口小部件。 =(

+0

非常感謝你的回答,我會盡力回覆你。關於Qt中佈局的複雜性,我也有同感。 有時候我想知道他們爲什麼使這個如此荒謬的混亂使用。 但無論如何其餘的Qt是很好理解... – 2013-03-24 13:03:58

+0

在網格佈局中,什麼是由QLayout :: indexOf()返回的? 它是行或列號,還是它只是列表的一些索引? – 2013-03-24 13:08:07

+0

我很確定這是一個列表中的一維索引。 – 2013-03-24 16:26:48

1

對於佈局位置的QGridLayout內取出一個小部件,你可以簡單地使用

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

但是,你必須要注意以下幾點吧:

  • 此代碼假定存在實際上是 中佈局指定位置上的一個項目,如果不是,itemAtPosition()將返回0,因此您需要確定位置,或者明確地檢查它的位置,
  • 此代碼將從佈局中移除小部件,但不會將其刪除。 您必須將小部件重新放回不同的佈局,或者自己給 小部件提供合理的幾何圖形。如果你不這樣做,這個小部件將保持 在當前位置可見。如果您希望小部件被破壞,您必須在從佈局中刪除 之後,將其明確刪除。
  • 此代碼僅適用於佈局中已被 與addWidget()一起添加的頂級窗口小部件。它不適用於添加了addLayout()的嵌套佈局。 如果您還需要關心嵌套佈局,請參閱 my answer about removing rows and columns from grid layouts