我正在开发qt中的GUI。我在QWidget
内有QPushButton
个QHBoxLayout
个QWidget::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}}的情况下做同样的事情?
答案 0 :(得分:2)
由于您的按钮位于布局中,因此您有以下无限循环:
如果你想要与按钮大小匹配的按钮,一种方法是自定义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++;
}