Qt布局儿童漂浮

我有一个空的水平布局,我动态填充三个孩子 . 这是一个纸牌游戏,所以这个布局动态填充了具有图像集的QLabel儿童 . 当我点击一张卡片进行播放并将其移动到屏幕中央时,我希望其他卡片的位置保持不变 . 相反,卡往往“浮动”到右边 . 我如何强迫他们保持原来的位置?

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

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

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

编辑

稍微澄清一张卡(B)播放时布局应如何显示 .

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

正如我所提到的,我设法用空的QWidget填充布局并将卡放在它们之上(不在它们内部) . 我实际上也摆脱了我不再需要的水平垫片 . 这看起来像我预期的那样有效,尽管我仍然没有完全验证这种方法 .

回答(2)

2 years ago

执行您想要的简单算法步骤:

  • 用户点击

  • 选择发生点击的标签

  • 如果有图像,请从标签中删除图像

  • 唐't remove the label from the layout, and make sure that the layout don' t调整标签大小

  • 将图像添加到棋盘游戏中心的标签上 .

  • 当用户点击没有任何内容的标签时,只需忽略该点击即可 .

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

EDIT: SOME OTHER PROPOSITIONS

  • 使用 QWidget::setFixedSize() 修复标签大小;

  • Don 't hide your label to remove your pixmap . Don' t设置一个空的像素图 . 相反,设置一个透明的像素图或填充一些中性色......

  • 或者子类 QLabel ,以便您可以指示最小大小提示 . 布局 must and will 尊重您设置的任何内容 . 例:

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

每次需要再次绘制整个应用程序时,都会检查所有窗口小部件属性 . 我的两分钱是当你玩牌时修改了尺寸属性,并且布局适应这种修改 . 告诉我大小提示技巧是否有效(应该) .

2 years ago

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