奇怪的行为覆盖QWidget :: resizeEvent(QResizeEvent * event)

时间:2012-02-29 16:51:38

标签: c++ qt qt4 qt4.7 qt4.8

我正在开发qt中的GUI。我在QWidget内有QPushButtonQHBoxLayoutQWidget::resizeEvent(QResizeEvent* event)。 这些按钮各有一个图标。 我需要覆盖button1->setIconSize(button1->size()); ,因为我不知道窗口的大小。我的按钮也一样。 这意味着我也必须调整图标大小。 我想放一个:

myWidget::resizeEvent(QResizeEvent* event)

myWidget::resizeEvent内,但是当我启动我的应用程序时,resizeEvent被递归调用.. 我甚至尝试用QtDesigner(eclipse插件)设置图标,但没有.. 唯一能产生良好效果的是为按钮设置固定大小,但这不是我需要的。 代码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

为什么用setIconSize递归调用resizeEvent? 有人经历过同样的问题吗? 建议在不经过{{1}}的情况下做同样的事情?

3 个答案:

答案 0 :(得分:2)

由于您的按钮位于布局中,因此您有以下无限循环:

  1. 设置图标大小会调整按钮的大小。
  2. 调整按钮大小可以使布局重新布局。
  3. Relayouting调整窗口小部件的大小
  4. 调用resizeEvent并设置图标大小
  5. 设置图标大小会调整按钮的大小。
  6. 继续2 ...
  7. 如果你想要与按钮大小匹配的按钮,一种方法是自定义QAbstractButton子类,它只是在自定义paintEvent中绘制像素图,将像素图缩放到小部件大小(这似乎大致是你想要的?)。这不会给你通常的免费按钮外观(按下时的视觉反馈,悬停,对焦框等)。

答案 1 :(得分:0)

当您将iconsize设置为其容器(标签,框架)的大小时,它会越过边框并导致容器调整大小,从而导致无限递归。如果您使用

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

你的按钮几乎没有明显区别,你可以避免无限递归。

答案 2 :(得分:0)

有一个不那么干净的解决方案,但它很容易完成工作。

根据QWidget中的元素数量(即包含布局的布局等),在用户手动更改窗口小部件的大小后,可能会有2个或更多自动调整大小操作。 (感谢Frank Osterfeld指出问题)

您可以在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++;
}