2012-10-19 137 views
1

我有一個空的水平佈局,我動態地填充三個孩子。這是一個紙牌遊戲,所以這個佈局會被QLabel中有圖像集的孩子動態填充。當我點擊一張卡片並在屏幕中央移動它時,我想讓其他卡片的位置保持不變。相反,卡片傾向於「向右」浮動。我如何強迫他們留在原來的位置?Qt佈局兒童浮動

+-----------------+ 
|     | 
| [A] - [B] - [C] | 
|     | 
+-----------------+ 

我試圖在每張卡之間放置一個可擴展的水平間隔器,但它並沒有真正的工作。我也嘗試用網格佈局替換水平佈局,但是這迫使我指定我不希望的卡片的初始座標。我喜歡這樣一個事實,即我可以使用addWidget附加窗口小部件,就像我在HTML版本中一樣。

在HTML版本中,我使用了一些卡周圍具有固定大小的包裝div。我如何在Qt中做類似的事情?

編輯

一點澄清,當一個卡(B)播放的佈局應該是什麼樣子。

+-----------------+ 
|     | 
| [A] -  - [C] | 
|     | 
+-----------------+ 

正如我所說,我設法以填補空QWidget的佈局,把卡在他們頂部(未在其內部)。我實際上也擺脫了我不再需要的水平間隔物。這似乎符合我的預期,但我仍然沒有完全驗證這種方法。

+0

您使用哪種佈局? 「動態」是什麼意思? – UmNyobe

+0

我正在使用水平佈局。動態地,我的意思是佈局最初是空的,然後我去layout.addWidget(卡)並填充它。 – Lorenzo

+0

你能展示一張卡片,兩張卡片盒子的佈局應該如何?它只是'[A]'和'[B]'呆在同一個地方嗎? – Avaris

回答

1

簡單的算法步驟做你想要什麼:

  • 用戶點擊
  • 選擇在點擊發生
  • 如果有一個形象的標籤,從標籤
  • 唐刪除圖像不要從佈局中移除標籤,並確保佈局不會調整標籤的大小
  • 將圖像添加到棋盤遊戲中心的標籤中。
  • 當用戶點擊沒有任何內容的標籤時,只需忽略點擊即可。

對於每個玩家你知道可以在你的佈局中顯示的最大數量的卡片。此外,我不認爲卡的大小是可變的。所以每次爲一個玩家創建一個套牌時,都要創建空標籤,每個標籤的大小都是固定的。

編輯:一些其它命題

  • 使用QWidget::setFixedSize()標籤的固定大小;
  • 不要隱藏標籤以刪除您的位圖。不要設置空的像素圖。相反,設置 一個像素圖是透明的或填充一些中性色...
  • 或者子類QLabel,使您可以指示最小大小提示。佈局必須和將尊重你設定的任何東西。例如:

    class MyQLabel : public QLabel { 
    
        MyQLabel(QSize cardSize, //remaining qlabel args) 
        :QLabel(//label args) 
        {_cardsize = cardcardSize;} 
    
        //only method to re-implement 
        virtual QSize minimumSizeHint() const {return _cardsize;} 
    private: 
        final QSize _cardsize; 
    } 
    

每次你的整個應用程序需要重新噴漆,所有控件的屬性進行檢查。我的兩分錢是當你玩一張牌時,一個大小的屬性被修改, 和佈局適應這種修改。告訴我,如果大小暗示技巧工作(它應該)。

+0

這可能是一個可行的解決方案。我可以使用QLabel的QPixmap屬性,在原始QLabel上將其設置爲None,然後在該板的中心創建一個新的QLabel。我會測試它,並讓你知道這是如何工作的。 – Lorenzo

+0

好,讓我知道。 – UmNyobe

+0

事實上,經過大量的擺弄之後,才成爲贏家。無論我做什麼,QLabels都會繼續滑動。我將接受這個解決方案。 – Lorenzo

1

在Qt中,你可以使用包裝QWidgetFixedsizePolicy

+0

你的意思是一個QWidget可以包含另一個QWidget?我的卡片類從QLabel(它是一個QWidget)繼承而來。也許這是可以通過代碼完成的事情,但在Qt Designer中我看不到這樣做。 – Lorenzo

+0

是的,QWidget可以託管另一個QWidgets。在Qt Designer中,您可以執行以下操作:單擊Widget,選擇Promote to ...,在Promoted類名稱中輸入MyCard並在頭文件中輸入適當的頭文件名。按添加,然後選擇添加的條目並按提升。 – Paul

+0

您可能還想看看'QGraphicsScene'和'QGraphicsView',也許它會更容易地實現你的遊戲而不是經典的小部件。 – Paul