3

空の水平レイアウトがあり、3人の子を動的に配置しています。これはカードゲームであるため、このレイアウトには、画像が設定されたQLabelである子が動的に入力されます。カードをクリックして再生し、画面の中央に移動すると、他のカードの位置は同じままになります。代わりに、カードは右に「浮く」傾向があります。どうすれば元の位置にとどまるように強制できますか?

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

各カードの間に拡張可能な水平スペーサーを入れてみましたが、実際には機能しません。また、水平レイアウトをグリッドレイアウトに置き換えてみましたが、これにより、カードの初期座標を指定する必要があります。HTMLバージョンの場合とほとんど同じように、addWidgetを使用してウィジェットを追加できるという事実が気に入っています。

HTMLバージョンでは、カードの周囲に固定サイズのラッパーdivをいくつか使用しています。Qtで同様のことを行うにはどうすればよいですか?

編集

1枚のカード(B)をプレイしたときにレイアウトがどのように見えるかについて少し説明します。

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

私が言ったように、私はなんとか空のQWidgetでレイアウトを埋め、それらの上に(それらの中にではなく)カードを置くことができました。水平スペーサーも不要になったので、実際に取り除きました。私はまだこのアプローチを完全に検証していませんでしたが、これは私が期待するように機能しているようです。

4

2 に答える 2

3

あなたが望むことをするための簡単なアルゴリズムのステップ:

  • ユーザーのクリック
  • クリックが発生したラベルを選択します
  • 画像がある場合は、ラベルから画像を削除します
  • レイアウトからラベルを削除しないでください。また、レイアウトのサイズがラベルのサイズを変更しないようにしてください。
  • ボードゲームの中央にあるラベルに画像を追加します。
  • ユーザーが何もないラベルをクリックした場合は、クリックを無視してください。

各プレイヤーについて、レイアウトに表示できるカードの最大数を知っています。また、カードのサイズは可変ではないと思います。したがって、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;
     }
    

アプリケーション全体を再度ペイントする必要があるたびに、すべてのウィジェットのプロパティがチェックされます。私の2セントは、カードをプレイするとサイズプロパティが変更され、レイアウトがこの変更に適応することです。サイズヒントのトリックが機能するかどうかを教えてください(そうする必要があります)。

于 2012-10-19T09:59:43.930 に答える
1

QWidgetQtでは、ラッパーを。で使用できますFixed sizePolicy

于 2012-10-19T09:25:13.787 に答える