【问题标题】:Strange behaviour overriding QWidget::resizeEvent(QResizeEvent* event)覆盖 QWidget::resizeEvent(QResizeEvent* event) 的奇怪行为
【发布时间】:2012-02-29 16:51:38
【问题描述】:

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

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

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

}

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

【问题讨论】:

  • 我认为递归是设计使然。来自 Qt 文档:“警告:在 resizeEvent() 中调用 resize() 或 setGeometry() 会导致无限递归。”
  • 你需要一个适当的布局,它负责调整底层元素的大小。如果您认为必须调用子元素的 resize() 或 setSize(),则您的小部件布局有问题。
  • 按钮已经在 QHBoxLayout 中,可以正确调整按钮的大小..

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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢你的回答,但我认为你犯了一个错误..正如我在脑海中所期望的那样setIconSize 没有调整QPushButton..然后我做了一个测试,它给了我原因..我不知道在回忆什么resizeEvent
【解决方案2】:

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

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

您的按钮几乎不会有明显差异,并且可以避免无限递归。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 2016-09-28
      • 1970-01-01
      相关资源
      最近更新 更多