2014-02-25 73 views
2

我有一個QVBoxLayout包含一些自定義窗口小部件,其本身主要由一個標籤和兩個按鈕。你幾乎可以用某種方式談論某種自制桌子。我知道有現成的表格小部件可用,但我想用我自己的。如何以編程方式更改佈局中窗口小部件的順序?

我想實現的是這樣的:當我點擊其中一個小部件中的「向上」按鈕時,它應該向上移動,或者換句話說:它應該改變它在父目錄QVBoxLayout中的當前位置/索引每次點擊都會向上(或相應地)移動一種方式。那可能嗎?我怎樣才能做到這一點?我需要這種用戶友好的方式來設置該佈局中項目的順序。

我開始試圖從我的小部件中獲取父佈局:

QVBoxLayout* myLayout = qobject_cast<QVBoxLayout*>(this->parentWidget()); 

,似乎工作,但如何從這裏下去?謝謝你的幫助!

+0

在'QBoxLayout :: insertWidget' – Kiwi

回答

4

你可以嘗試這樣的事情:

enum MoveDirection { MoveUp, MoveDown }; 
bool move(QWidget *widget, MoveDirection direction) { 
    QVBoxLayout* myLayout = qobject_cast<QVBoxLayout*>(widget->parentWidget()->layout()); 

    //Gets the index of the widget within the layout 
    const int index = myLayout->indexOf(widget); 

    if (direction == MoveUp && index == 0) { 
    //Can't move up 
    return false; 
    } 

    if (direction == MoveDown && index == myLayout->count()-1) { 
    //Can't move down 
    return false; 
    } 

    //Compute new index according to direction 
    const int newIndex = direction == MoveUp ? index - 1 : index + 1; 
    //Remove widget from layout 
    myLayout->removeWidget(widget); 
    //Insert widget at new position 
    myLayout->insertWidget(newIndex , widget); 

    return true; 
} 
+0

看起來不錯看看,謝謝!我希望有一個更優雅的方式(即簡單地設置一個新的指數),但我想在一個刪除和添加在新位置是唯一可能的方式。 – Robert

+0

更新:測試後,這裏有一個小修正:一個需要從投「小窗口> parentWidget() - >佈局()」而不是「小窗口> parentWidget()」,以獲取佈局對象。 – Robert

+0

@Robert固定的,我只是複製該行從你的問題。謝謝。 –

0

同意C.E. Gesser,還有像 「​​setIndex」 爲佈局內layoutitems沒有任何接口。

如果要實現像棋盤象棋,其中移動部件經常運行一些應用程序,的QGraphicsView +的QGraphicsItem(SA QWidgetItem)可能會有所幫助。

相關問題