2012-02-29 6 views
1

私はqtでGUIを開発しています。私はQWidgetQHBoxLayoutの中に4つのQPushButtonとしています。 これらのボタンにはそれぞれアイコンがあります。 QWidget::resizeEvent(QResizeEvent* event)を無効にする必要があります。なぜなら、ウィンドウのサイズがわからないからです。私のボタンも同じです。 これは私もアイコンのサイズを変更する必要があることを意味します。 は私が配置するために考えた:私はQtDesigner(Eclipseプラグイン)が、何もアイコンを設定しても試してみました ... myWidget::resizeEvent(QResizeEvent* event)QWidget :: resizeEvent(QResizeEvent * event)をオーバーライドする奇妙な動作

button1->setIconSize(button1->size()); 

をしかし、私は自分のアプリケーションを起動したときに、myWidget::resizeEventを再帰的に呼び出されます。.. 唯一のこと良い結果は、ボタンに固定サイズを設定していますが、それは私が必要なものではありません。 resizeEventの コード:

なぜ resizeEvent setIconSizeで再帰的に呼び出された
void myWidget::resizeEvent(QResizeEvent* event) { 

    this->QWidget::resizeEvent(event); 
    ui.button1->setIconSize(ui.button1->size()); 
    ui.button2->setIconSize(ui.button2->size()); 
    ui.button3->setIconSize(ui.button3->size()); 
    ui.button4->setIconSize(ui.button4->size()); 

} 

? 同じ問題を経験した人がいますか? resizeEventを経由せずに同じことを行うことを提案しますか?

+0

私は再帰が設計によるものだと思います。 Qtのドキュメントから: "警告:resizeEvent()内でresize()またはsetGeometry()を呼び出すと、無限の再帰が発生する可能性があります。" – hirschhornsalz

+1

適切なレイアウトが必要です。これは、基になる要素のサイズ変更を処理します。下位要素のresize()またはsetSize()を呼び出さなければならないと思われる場合は、ウィジェットレイアウトに問題があります。 – hirschhornsalz

+0

ボタンは既にボタンをリサイズするQHBoxLayoutの中にあります.. –

答えて

2

あなたのボタンがレイアウトであるとして、次の無限ループを持っている:

  1. アイコンのサイズがボタンのサイズを変更設定します。
  2. ボタンのサイズを変更すると、レイアウトを再レイアウトできます。
  3. Relayoutingは
  4. resizeEventが呼び出されたウィジェットのサイズを変更して、アイコンのサイズがボタンのサイズを変更する設定アイコンサイズ
  5. を設定します。
  6. 2に進んで...

ボタンのサイズに合わせ、ボタンをしたい場合は、一つの方法は、単に(サイズのウィジェットにピックスマップをスケーリング、カスタムpaintEventでピックスマップを描画するカスタムQAbstractButtonサブクラスになりおおよそあなたが望んでいると思われる?)。それはあなたにいつものボタンの外観を与えることはありません(押されたときの視覚的なフィードバック、ホバー、フォーカスフレームなど)。

+0

私はあなたに間違いを犯したと思っています。私の心では ​​'setIconSize'は' QPushButton'..sizeをサイズ変更しませんテストとそれは私に理由を与えた..私は 'resizeEvent'を呼び出すのか分からない –

0

アイコンサイズをコンテナのサイズ(ラベル、フレーム)に設定すると、境界線を越えてコンテナのサイズが変更され、無限の再帰が発生します。あなたは

ui.button1->setIconSize(ui.button1->(size()-0.01)); 

を使用した場合、あなたはあなたのボタンで辛うじて顕著な違いがあるんだけど、あなたは無限の再帰を避けるためと思います。

0

きれいではない解決策はありますが、簡単であり、仕事を完了させることができます。

QWidget内の要素の量(レイアウトなどを含むレイアウト)によって、ユーザーが手動でウィジェットのサイズを変更した後で、2つ以上の自動サイズ変更操作が行われることがあります。

あなたのresizeEvent定義内にカウンタを追加して、カウンターが自動サイズ変更操作+ 1の数の倍数である場合にのみコードを実行することができます(試用版でこれを見つけることができますエラーが発生した場合)、コードが実行されると0にリセットされるため、ウィジェットを最大化するときにも機能します。

私はちょうどQT初心者ですので、私が気づいていない非常に良い理由があるかもしれないので、このアプローチを慎重に取ってください。

void 
MyWidget::resizeEvent(QResizeEvent *event) 
{ 
    if((ignore_resize % num_of_auto_ops) == 0) 
    { 

     this->QWidget::resizeEvent(event); 
     ui.button1->setIconSize(ui.button1->size()); 
     ui.button2->setIconSize(ui.button2->size()); 
     ui.button3->setIconSize(ui.button3->size()); 
     ui.button4->setIconSize(ui.button4->size()); 

     ignore_resize = 0; 
    } 
    ignore_resize++; 
}