2017-05-08 39 views
1

overlaping讓我們假設我們有網格佈局是這樣的:Qt的 - 標籤在網格佈局

this->layout = new QGridLayout; 

ClickableLabel *lab1 = new ClickableLabel(); 
this->layout->addWidget(lab1, 0, 0); 

ClickableLabel *lab2 = new ClickableLabel(); 
this->layout->addWidget(lab2, 1, 0); 

是否有可能在這兩個ClickableLabels互相重疊?我正在製作一款紙牌遊戲,我需要紙牌(標籤)像紙牌一樣重疊。現在我的問題是:我需要爲此使用另一種佈局嗎?或者我可以像setGeometrymove一些把戲做到這一點。(這一切沒有工作對我來說)

+3

如果您希望它們重疊,請不要使用網格佈局並自己定位窗口小部件。 – SPlatten

+0

這樣我應該使用哪種佈局?垂直? – nocturne

+1

無,您不必使用佈局,您可以自己將小部件放置在顯示器上。如果你的主應用程序類是從QMainWindow派生的,那麼你可以直接渲染到這個。 – SPlatten

回答

2

假設重疊是相當靜態的,你可以很容易地通過使每個ClickableLabel跨度multiple rows and/or columns模擬它...

this->layout = new QGridLayout; 

ClickableLabel *lab1 = new ClickableLabel(); 
this->layout->addWidget(lab1, 0, 0, 2/* Row span */, 1/* Column span */); 

ClickableLabel *lab2 = new ClickableLabel(); 
this->layout->addWidget(lab2, 1, 0, 2/* Row span */, 1/* Column span */); 

在上述lab1的例子將佔據行0和1和lab2將佔據行1和2因此它們將在行1中重疊,並且z順序由它們的添加順序決定。

+0

我不明白跨度如何工作,但這可能是我正在尋找的 – nocturne

1

我使用的QMainWindow爲我的申請,渲染一大堆這是在XML文件中定義窗口小部件,位置的小部件在相對座標中指定。 QMainWindow是爲整個顯示設置的。

1

請不要那樣做。

如果你正在創建一個紙牌遊戲,那麼你需要創建紙牌,而不是按鈕,也不能把它們放在佈局中。 問題是,來自Qt的佈局管理系統是古老的,它並沒有真正考慮到監視器中的項目作爲第一類citzens - 它將它們安排在佈局中,就是這樣。

如果你到紙牌遊戲和Qt,你有兩個簡單的選擇:

1 - 老款(和一個我其實知道如何教) - QGraphivsView

創建基於您的卡類QGraphicsRectItem,並重寫mousePress和mouseRelease事件以允許單擊和拖動。

class Card : public QObject, public QGraphicsRectItem { 
Q_OBJECT 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *ev) 
    { 
     clicked(); 
     startDrag = true; 
    } 
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *ev) 
    { 
     if(!startDrag) 
      return; 

     setPos(ev->pos()); 
     startDrag = false; 
    }  
    void mouseMoveEvent(QGraphicsSceneMouseEvent *ev) 
    { 
     if (!startDrag) 
      return(); 
     setPos(ev->pos()); 
    } 
signals: 
    void clicked(); 
}; 

然後還會創建一個基於QGraphivsView的新類,它將成爲您的主板,並根據您的處理算法排列卡片。

2 - 我不能教的風格:QML。

+0

嗯謝謝你的解釋,我想我沒有足夠的時間來玩這個。 – nocturne

+1

在QGraphivsView上創建它的時間比處理佈局問題的時間要少。 –

+0

我設法做到了我想要的。但再次感謝。 – nocturne