Strange behaviour overriding QWidget::resizeEvent(QResizeEve

Strange behaviour overriding QWidget::resizeEvent(QResizeEvent* event)

本文关键字:resizeEvent QResizeEve QWidget behaviour overriding Strange      更新时间:2023-10-16

我正在用qt开发一个GUI,我有一个QWidgetQHBoxLayout里面有四个QPushButton。这些按钮各有一个图标。我需要覆盖QWidget::resizeEvent(QResizeEvent* event),因为我不知道我的窗口的确切大小。我的按钮也是如此。这意味着我也必须调整图标大小。我想放一个:

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

myWidget::resizeEvent(QResizeEvent* event)内部,但是当我启动应用程序时,myWidget::resizeEvent被递归调用。我甚至尝试使用QtDesigner(日食插件(设置图标,但什么都没有。唯一能给出良好结果的是将固定大小设置为按钮,但这不是我需要的。resizeEvent代码 :

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

为什么resizeEventsetIconSize递归调用?有人遇到过同样的问题吗?建议在不经过resizeEvent的情况下做同样的事情?

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

  1. 设置图标大小可调整按钮大小。
  2. 调整按钮大小可重新布局布局。
  3. 重新布局可调整小组件的大小
  4. 调用 resizeEvent 并设置图标大小
  5. 设置图标大小可调整按钮大小。
  6. 继续 2...

如果你想要与按钮大小匹配的按钮,一种方法是自定义QAbstractButton子类,它只是在自定义paintEvent中绘制像素图,将像素图缩放到小部件大小(这似乎是你想要的大致?不过,这不会免费为您提供通常的按钮外观(按下时的视觉反馈、悬停、对焦框等(。

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

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

你的按钮几乎没有明显的差异,你会避免无限递归。

有一个不太干净的解决方案,但它很容易,并且可以完成工作。

根据 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++;
}