免责声明
下面的解决方案是对如何知道用户何时完成窗口大小调整?这个问题的回答,这个问题很清楚,可以回答。
但是,我相信您遇到了 XY 问题。您遇到的渲染缓慢可能是由于使用了错误的技术,但不看代码就无法判断。我建议你在另一个问题中描述你的渲染问题,用Minimal, Reproducible Example 支持它。
解决方案
我解决此类问题的方法是:
- 在调整大小之前采取行动
正如@musicamante 在 cmets 中所写:
当您收到 resizeEvent 时,调整大小已经发生
超越QWidget::resizeEvent 的方法是使用QObject::event 并注意QEvent::type QResizeEvent。
- 尝试区分程序调整大小,即调用
QWidget::resize和用户调整大小,即通过拖动窗口的边缘
QEvent::spontaneous 可以用于此目的,因为它:
如果事件源自应用程序外部(系统事件),则返回 true;否则返回 false。
如果事件是非自发的(程序调整大小),允许生成resizeEvent 来设置复杂小部件的初始大小。对于自发事件(用户调整大小),阻止resizeEvent 的生成并手动处理复杂小部件的大小
- 获取用户完成窗口大小调整的准确时刻,而不是像@G.M.那样使用计时器。 (顺便说一句,我非常尊重)建议
NonClientAreaMouseButtonRelease 事件类型在这里可能会派上用场。
这并不一定意味着用户正在调整窗口大小。这种事件类型也是由拖动窗口生成的。但是,在这种情况下,这不会影响解决方案。
注意:不要将复杂的小部件添加到任何布局中,因为它会破坏手动大小处理。
示例
以下是我为您编写的 C++ 示例,目的是演示如何实施建议的解决方案:
#include <QApplication>
#include <QResizeEvent>
#include <QFormLayout>
#include <QLineEdit>
class MainWindow : public QWidget
{
QWidget *m_complexWidget;
public:
MainWindow(QWidget *parent = nullptr) :
QWidget(parent),
m_complexWidget(new QWidget(this)) {
auto *form = new QFormLayout(m_complexWidget);
for (int n = 0; n < 20; n++)
form->addRow(tr("Property ") + QString::number(n),
new QLineEdit(this));
resize(400, 400);
}
bool event(QEvent *event) override {
switch (event->type()) {
case QEvent::NonClientAreaMouseButtonRelease:
// The widget is resized at the end of a resize
m_complexWidget->resize(size());
break;
case QEvent::Resize:
// Prevent generation of a resize event
if (event->spontaneous())
return false;
break;
default:
break;
}
return QWidget::event(event);
}
protected:
void resizeEvent(QResizeEvent *event) override {
// The widget's size is set to the initial size of the window
m_complexWidget->resize(event->size());
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}