Strange behaviour overriding QWidget::resizeEvent(QResizeEve
Strange behaviour overriding QWidget::resizeEvent(QResizeEvent* event)
我正在用qt开发一个GUI,我有一个QWidget
,QHBoxLayout
里面有四个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());
}
为什么resizeEvent
与setIconSize
递归调用?有人遇到过同样的问题吗?建议在不经过resizeEvent
的情况下做同样的事情?
由于按钮位于布局中,因此具有以下无限循环:
- 设置图标大小可调整按钮大小。
- 调整按钮大小可重新布局布局。
- 重新布局可调整小组件的大小
- 调用 resizeEvent 并设置图标大小
- 设置图标大小可调整按钮大小。
- 继续 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++;
}