我正在为自己编写一个 PDF 阅读器,以获取乐趣和咯咯笑,但是当调整窗口大小时我遇到了麻烦。问题如下:当加载 PDF 时调整窗口大小时,将再次渲染 PDF 以匹配新的窗口大小,但是 resizeEvent 被多次调用,因此渲染函数被多次调用,这效率极其低下并导致滞后。有没有办法让程序在 resizeEvent 完全完成时发出通知,然后调用渲染函数?欢迎使用 Python 和 C++ 提供解决方案
最佳答案
免责声明
下面的解决方案是对问题如何知道用户何时完成调整窗口大小?的回答,这个问题很清楚,可以回答。
但是,我相信您遇到了 XY 问题。您遇到的渲染缓慢可能是由于使用了错误的技术,但如果不查看代码,就无法判断。我建议您在另一个问题中描述您的渲染问题,并用 Minimal, Reproducible Example 支持它。 .
解决方案
我解决此类问题的方法是:
- 在调整大小之前执行操作
正如@musicamante 在评论中写道:
When you receive a resizeEvent the resizing has already happened
超车方式QWidget::resizeEvent
正在使用 QObject::event
相反,请注意 QEvent::type
QResizeEvent
.
- 尝试区分程序调整大小,即调用
QWidget::resize
以及用户调整大小,即通过拖动窗口边缘
QEvent::spontaneous
可以用于此目的,因为它:
Returns true if the event originated outside the application (a system event); otherwise returns 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();
}
关于python - 如何知道用户何时完成调整窗口大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64537302/