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())