python - 如何知道用户何时完成调整窗口大小?

标签 python c++ qt pyqt5 qt5

我正在为自己编写一个 PDF 阅读器,以获取乐趣和咯咯笑,但是当调整窗口大小时我遇到了麻烦。问题如下:当加载 PDF 时调整窗口大小时,将再次渲染 PDF 以匹配新的窗口大小,但是 resizeEvent 被多次调用,因此渲染函数被多次调用,这效率极其低下并导致滞后。有没有办法让程序在 resizeEvent 完全完成时发出通知,然后调用渲染函数?欢迎使用 Python 和 C++ 提供解决方案

最佳答案

免责声明

下面的解决方案是对问题如何知道用户何时完成调整窗口大小?的回答,这个问题很清楚,可以回答。

但是,我相信您遇到了 XY 问题。您遇到的渲染缓慢可能是由于使用了错误的技术,但如果不查看代码,就无法判断。我建议您在另一个问题中描述您的渲染问题,并用 Minimal, Reproducible Example 支持它。 .

解决方案

我解决此类问题的方法是:

  1. 在调整大小之前执行操作

正如@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/

    相关文章:

    python - 如何用opencv为python编写灰色(1 channel )图像

    c++ - 使用 openCV 时如何修复链接器错误?

    c++ - 如何在 Qt 中创建 MD5 哈希?

    c++ - 与sqlite数据库qt c++同步文件

    python - 子图上的 x 轴标题 Plotly Python

    python - 将组合框中选定的选项设置为变量,该变量随着组合框中选定的选项的变化而变化

    python - NumPy:3 字节、6 字节类型(又名 uint24、uint48)

    c++ - 谁负责删除构面?

    c++ - 数组何时自动初始化为其默认数据类型?

    c++ - 切换 QDeclarativeView 的源