QAxWidget 在调整 GUI 窗口大小时出现问题。

huangapple go评论74阅读模式
英文:

QAxWidget glitches when resizing GUI window

问题

我目前正在探索使用PyQt5/PyQt6和Python在GUI中显示和处理PowerPoint演示文稿的可能性。为此,我发现使用QAxWidget是最有希望的解决方案。加载和显示pptx文件工作正常,但不幸的是,我注意到在调整GUI窗口大小时会出现一些故障。

作为一个最小的示例,我使用了官方Qt文档中的以下教程:https://doc.qt.io/qtforpython/examples/example_axcontainer__axviewer.html?highlight=qaxwidget

在QAxWidget()初始化之后,我只添加了以下行:

self.axWidget.setControl(r"C:\path\to\file\presentation.pptx")

完整的代码(摘自:https://doc.qt.io/qtforpython/examples/example_axcontainer__axviewer.html?highlight=qaxwidget):

# 版权所有(C)2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

"""PySide6 Active Qt Viewer示例"""

import sys
from PyQt5.QtWidgets import qApp
from PyQt5.QtAxContainer import QAxSelect, QAxWidget
from PyQt5.QtGui import QAction
from PyQt5.QtWidgets import (QApplication, QDialog, QMainWindow, QMessageBox, QToolBar)

class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()

        toolBar = QToolBar()
        self.addToolBar(toolBar)
        fileMenu = self.menuBar().addMenu("&File")
        loadAction = QAction("Load...", self, shortcut="Ctrl+L", triggered=self.load)
        fileMenu.addAction(loadAction)
        toolBar.addAction(loadAction)
        exitAction = QAction("E&xit", self, shortcut="Ctrl+Q", triggered=self.close)
        fileMenu.addAction(exitAction)

        aboutMenu = self.menuBar().addMenu("&About")
        aboutQtAct = QAction("About &Qt", self, triggered=qApp.aboutQt)
        aboutMenu.addAction(aboutQtAct)
        self.axWidget = QAxWidget()
        self.axWidget.setControl(r"C:\path\to\file\presentation.pptx")
        self.setCentralWidget(self.axWidget)

    def load(self):
        axSelect = QAxSelect(self)
        if axSelect.exec() == QDialog.Accepted:
            clsid = axSelect.clsid()
            if not self.axWidget.setControl(clsid):
                QMessageBox.warning(self, "AxViewer", f"Unable to load {clsid}.")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWin = MainWindow()
    availableGeometry = mainWin.screen().availableGeometry()
    mainWin.resize(availableGeometry.width() / 3, availableGeometry.height() / 2)
    mainWin.show()
    sys.exit(app.exec())

当调整GUI窗口大小时,下面会出现一些故障:

QAxWidget 在调整 GUI 窗口大小时出现问题。

在调整大小时显示结果的动画:

QAxWidget 在调整 GUI 窗口大小时出现问题。

不幸的是,我没有找到太多可用于在Python中与QAxWidget结合使用的资源,以便自己解决这个问题。这就是为什么我在这里问是否有人能够提供解决这些故障的解决方案。

英文:

I am currently exploring the possibilities of displaying and working with PowerPoint presentations in a GUI using PyQt5/PyQt6 and Python. For that I found the most promising solution to be using a QAxWidget. Loading and displaying the pptx-file works fine, but unfortunately I noticed glitches when resizing the window of the GUI.

As a minimal example I used the following tutorial from the official Qt docs:
https://doc.qt.io/qtforpython/examples/example_axcontainer__axviewer.html?highlight=qaxwidget

After the QAxWidget()-initialization i just added the following line:

self.axWidget.setControl(r"C:\path\to\file\presentation.pptx")

Full code (taken from: https://doc.qt.io/qtforpython/examples/example_axcontainer__axviewer.html?highlight=qaxwidget):

# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

"""PySide6 Active Qt Viewer example"""

import sys

from PyQt5.QtWidgets import qApp
from PySide6.QtAxContainer import QAxSelect, QAxWidget
from PySide6.QtGui import QAction
from PySide6.QtWidgets import (QApplication, QDialog,
                               QMainWindow, QMessageBox, QToolBar)


class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()

        toolBar = QToolBar()
        self.addToolBar(toolBar)
        fileMenu = self.menuBar().addMenu("&File")
        loadAction = QAction("Load...", self, shortcut="Ctrl+L", triggered=self.load)
        fileMenu.addAction(loadAction)
        toolBar.addAction(loadAction)
        exitAction = QAction("E&xit", self, shortcut="Ctrl+Q", triggered=self.close)
        fileMenu.addAction(exitAction)

        aboutMenu = self.menuBar().addMenu("&About")
        aboutQtAct = QAction("About &Qt", self, triggered=qApp.aboutQt)
        aboutMenu.addAction(aboutQtAct)
        self.axWidget = QAxWidget()
        self.axWidget.setControl(r"C:\path\to\file\presentation.pptx")
        self.setCentralWidget(self.axWidget)

    def load(self):
        axSelect = QAxSelect(self)
        if axSelect.exec() == QDialog.Accepted:
            clsid = axSelect.clsid()
            if not self.axWidget.setControl(clsid):
                QMessageBox.warning(self, "AxViewer", f"Unable to load {clsid}.")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWin = MainWindow()
    availableGeometry = mainWin.screen().availableGeometry()
    mainWin.resize(availableGeometry.width() / 3, availableGeometry.height() / 2)
    mainWin.show()
    sys.exit(app.exec())

When resizing the window of the GUI, there appear some glitches underneath:

QAxWidget 在调整 GUI 窗口大小时出现问题。

An animation that shows the result while resizing:

QAxWidget 在调整 GUI 窗口大小时出现问题。

Unfortunately I haven't found many resources I could use where a QAxWidget is used in combination with Python to figure this out myself. That's why I'm here to ask if anyone out there might have a solution for getting rid of those glitches.

答案1

得分: 0

我通过使用self.axWidget.installEventFilter(self)来安装一个事件过滤器到QAxWidget来摆脱了故障。这将调用我像这样设置的QMainWindoweventFilter()方法:(ReportDefinitionTool在这里是QMainWindow的子类。)

    def eventFilter(self, widget: QWidget, event: QEvent):
        if event.type() == QEvent.Resize and widget is self.pptx_axwidget:
            self.pptx_axwidget.setFixedHeight(int(self.pptx_axwidget.width() / 16 * 9))

        return super(ReportDefinitionTool, self).eventFilter(widget, event)

由于PowerPoint演示以16:9格式显示,这将确保QAxWidget仅占用这个空间。初始问题中出现的故障空间来自于QAxWidget的未使用空间。

英文:

I got rid of the glitches by installing an event filter to the QAxWidget using self.axWidget.installEventFilter(self).

This will call the eventFilter()-method of the QMainWindow which I set up like this: (ReportDefinitionTool is the subclass of QMainWindow here.)

    def eventFilter(self, widget: QWidget, event: QEvent):
        if event.type() == QEvent.Resize and widget is self.pptx_axwidget:
            self.pptx_axwidget.setFixedHeight(int(self.pptx_axwidget.width() / 16 * 9))

        return super(ReportDefinitionTool, self).eventFilter(widget, event)

Since the PowerPoint-presentation is displayed in a 16:9 format, this will make sure the QAxWidget does only occupy this space. The glitchy space from the initial question came from the unused space of the QAxWidget.

huangapple
  • 本文由 发表于 2023年2月10日 07:33:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/75405547.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定