2017-05-14 75 views
2

我試圖讓部件在Qt佈局中部分重疊。我現在的佈局如下,以QVBoxLayout包含四個QHBoxLayout孩子實現:使部件在Qt佈局中部分重疊

My current layout, achieved with a QVBoxLayout containing four QHBoxLayout children

我試圖重新集結相同花色的牌,爲了達到這樣的(注意,是水平垂直重疊):

This is the kind of overlapping I'm trying to achieve

不幸的是,所有的Qt文檔和所有的堆棧溢出的帖子我看了嘗試AV oid部件重疊而不是尋找它。也許有一種方法可以設置窗口小部件之間的負間距,或者強制佈局計算最大寬度(例如根據這種情況下的一套服裝的數量)?或者我必須創建一個自定義佈局?也許我不應該使用佈局?

如果它的任何幫助,我添加小部件與代碼看起來像這樣的佈局:

hLayout[card.getSuit()-1]->addWidget(cardWidget, 0, align); 

回答

3

您需要實現QLayout的子類。還有就是QT文檔中一個詳細的例子正好解決你的問題:Layout Management

基本上,你需要定義如下:

  • 的數據結構來存儲佈局處理的項目。每個項目都是一個QLayoutItem。

  • addItem(),如何將項目添加到佈局。

  • setGeometry(),如何執行佈局。

  • sizeHint(),佈局的首選大小。

  • itemAt(),如何迭代佈局。

  • takeAt(),如何從佈局中刪除項目。

在大多數情況下,您還將實現minimumSize()。

下面我抄在該示例代碼中最重要的組成部分,爲您提供方便:

class CardLayout : public QLayout 
{ 
public: 
    CardLayout(QWidget *parent, int dist): QLayout(parent, 0, dist) {} 
    CardLayout(QLayout *parent, int dist): QLayout(parent, dist) {} 
    CardLayout(int dist): QLayout(dist) {} 
    ~CardLayout(); 

    void addItem(QLayoutItem *item); 
    QSize sizeHint() const; 
    QSize minimumSize() const; 
    int count() const; 
    QLayoutItem *itemAt(int) const; 
    QLayoutItem *takeAt(int); 
    void setGeometry(const QRect &rect); 

private: 
    QList<QLayoutItem*> list; 
}; 


void CardLayout::setGeometry(const QRect &r) 
{ 
    QLayout::setGeometry(r); 

    if (list.size() == 0) 
     return; 

    int w = r.width() - (list.count() - 1) * spacing(); 
    int h = r.height() - (list.count() - 1) * spacing(); 
    int i = 0; 
    while (i < list.size()) { 
     QLayoutItem *o = list.at(i); 
     QRect geom(r.x() + i * spacing(), r.y() + i * spacing(), w, h); 
     o->setGeometry(geom); 
     ++i; 
    } 
} 
+0

我不能相信我沒有看到這一點。感謝您的鏈接和增加的細節! – juef