0
点赞
收藏
分享

微信扫一扫

PyQt6 使用 QAxWidget 打开 IE/Word

一条咸鱼的干货 2022-01-20 阅读 232

QAxWidget 一句话介绍 

QAxWidget类是一个包装ActiveX控件的QWidget,它可以组织在一个小部件层次结构和布局中,或者作为一个事件过滤器。

参考链接

  •  QAxWidget 妙用 - Avatarx - 博客园
  • pyqt5 使用QAxWidget怎么显示Microsoft Word? · Issue #7 · PyQt5/PyQt · GitHub
  • QAxWidget Class | Active Qt 6.3.0
  • QAxWidget Class | Active Qt 5.15.9
  • 如何查看ActiveX控件的UUID?_刘永年-CSDN博客

正文

QAxWidget 从QAxBase继承了大部分与 ActiveX 相关的功能,特别是 dynamicCall() 和 querySubObject()。 

下面将使用 setControl() 和 dynamicCall() 打开IE浏览器,浏览百度地图网址。

简单介绍 setControl()

setControl()会初始化ActiveX组件,请结合下方代码阅读。

在PyQt6中,如果之前已经设置了ActiveX组件,resetControl()会将之前的ActiveX组件关闭。

 

简单介绍 dynamicCall()

调用ActiveX组件的方法,传递参数,并返回ActiveX组件的返回值。

如果调用ActiveX组件的方法失败,或者ActiveX组件没有返回值,则返回无效的QVariant。

示例一:直接继承QAxWidget窗口,调用IE

PyQt6 > QAxContainer > QAxWidget

import sys
from PyQt6.QAxContainer import QAxWidget
from PyQt6.QtWidgets import QApplication


class Window(QAxWidget):

    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        self.setFixedSize(900, 600)

        self.setControl("{8856F961-340A-11D0-A96B-00C04FD705A2}")
        self.dynamicCall("Navigate(const QString&)", "https://map.baidu.com/@13523265.31,3641114.64,12z")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec())

 

示例二:在QWidget窗口中,加入QAxWidget控件,调用IE

import sys
from PyQt6.QAxContainer import QAxWidget
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QApplication
from PyQt6.QtCore import Qt


class Window(QWidget):

    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        self.setFixedSize(900, 600)
        layout = QVBoxLayout(self)
        self.axWidget = QAxWidget("ObjectName", self)
        layout.addWidget(self.axWidget)
        self.axWidget.setControl("{8856F961-340A-11D0-A96B-00C04FD705A2}")
        self.axWidget.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
        self.axWidget.setProperty("DisplayAlerts", False)
        self.axWidget.setProperty("DisplayScrollBars", True)
        self.axWidget.dynamicCall("Navigate(const QString&)", "https://map.baidu.com/@13523265.31,3641114.64,12z")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec())

 

示例三:打开Word

import sys
from PyQt6.QAxContainer import QAxWidget
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QApplication, QPushButton, QFileDialog
from PyQt6.QtCore import Qt


class Window(QWidget):

    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        self.setFixedSize(900, 600)
        layout = QVBoxLayout(self)
        self.axWidget = QAxWidget("ObjectName", self)
        layout.addWidget(self.axWidget)
        layout.addWidget(QPushButton('打开word', self, clicked=self.onOpenWord))
        self.axWidget.setControl("{8856F961-340A-11D0-A96B-00C04FD705A2}")
        self.axWidget.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
        self.axWidget.setProperty("DisplayAlerts", False)
        self.axWidget.setProperty("DisplayScrollBars", True)
        self.axWidget.dynamicCall("Navigate(const QString&)", "https://map.baidu.com/@13523265.31,3641114.64,12z")

    def onOpenWord(self):
        path, _ = QFileDialog.getOpenFileName(self, '请选择Word文件', '', 'word(*.docx *.doc)')
        if not path:
            return
        # 不显示窗体
        self.axWidget.resetControl()
        self.axWidget.setControl(path)
        self.axWidget.dynamicCall('SetVisible (bool Visible)', 'false')
        self.axWidget.setProperty('DisplayAlerts', False)
        

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec())

 

举报

相关推荐

0 条评论