1

我正在用 qt 开发一个 GUI。我有一个里面QWidget有四个。这些按钮每个都有一个图标。我需要覆盖,因为我不知道我的窗口到底有多大。我的按钮也是如此。这意味着我也必须调整图标大小。我想放置一个:QPushButtonQHBoxLayoutQWidget::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());

}

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

4

3 回答 3

2

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

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

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

于 2012-02-29T21:06:01.113 回答
0

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

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

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

于 2013-06-07T21:15:28.793 回答
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++;
}
于 2013-09-27T10:10:03.190 回答