3

我有一个空的水平布局,我用三个孩子动态填充。这是一款纸牌游戏,因此该布局会动态填充有图像集的 QLabel 子级。当我点击一张牌来播放它并将它移动到屏幕中央时,我希望其他牌的位置保持不变。相反,卡片倾向于向右“浮动”。我怎样才能强迫他们留在原来的位置?

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

我尝试在每张卡之间放置一个可扩展的水平垫片,但它并没有真正起作用。我还尝试用网格布局替换水平布局,但这迫使我指定我不希望的卡片的初始坐标。我喜欢这样一个事实,即我可以像在 HTML 版本中那样使用 addWidget 附加小部件。

在 HTML 版本中,我在卡片周围使用了一些固定大小的包装 div。我怎样才能在 Qt 中做类似的事情?

编辑

对打出一张牌 (B) 时布局的外观进行一点说明。

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

正如我所提到的,我设法用空的 QWidget 填充布局并将卡片放在它们上面(而不是在它们里面)。我实际上也摆脱了我拥有的水平垫片,因为它们不再需要了。这似乎按我的预期工作,尽管我仍然没有完全验证这种方法。

4

2 回答 2

3

做你想做的简单算法步骤:

  • 用户点击
  • 选择点击发生的标签
  • 如果有图像,从标签中删除图像
  • 不要从布局中删除标签,并确保布局不会调整标签大小
  • 将图像添加到棋盘游戏中心的标签中。
  • 当用户点击一个没有任何内容的标签时,忽略该点击。

对于每个玩家,您都知道可以在布局中显示的最大卡片数量。此外,我不认为卡的大小是可变的。所以每次你为一个玩家创建一个牌组时,创建一个空标签,每个标签都有一个固定的大小。

编辑:其他一些提议

  • 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;
     }
    

每次需要重新绘制整个应用程序时,都会检查所有小部件属性。我的两分钱是在你打牌时修改了一个 size 属性,并且布局适应了这个修改。告诉我尺寸提示技巧是否有效(应该)。

于 2012-10-19T09:59:43.930 回答
1

在 Qt 中,您可以将包装器QWidgetFixed sizePolicy.

于 2012-10-19T09:25:13.787 回答