2012-10-19 139 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