调用QScreen.grabWindow()时发生类型错误

问题描述 投票:0回答:1

我正在尝试使用PySide截屏(并返回QPixmap)。这是较大脚本的一部分。不幸的是,我现在正碰壁。

这是我要开始使用的简化代码段:

from PySide2 import QtGui, QtWidgets

screen = QtWidgets.QApplication.primaryScreen()
winid = QtWidgets.QApplication.desktop().winId()
pixmap = screen.grabWindow(winid)

label = QtWidgets.QLabel("test")
label.setPixmap(pixmap)
label.show()

执行此操作时,它将引发以下错误:

TypeError: 'PySide2.QtGui.QScreen.grabWindow' called with wrong argument types:
PySide2.QtGui.QScreen.grabWindow(int)
Supported signatures:
PySide2.QtGui.QScreen.grabWindow(quintptr, int = 0, int = 0, int = -1, int = -1)

我正在使用PySide版本2.0.0〜alpha0(这是我使用的宿主应用程序附带的版本)。我已经在使用PySide2版本5.12.2的新版本主机应用程序中测试了相同的代码,该代码按预期执行,没有任何错误...但是,我仅限于使用旧版本的主机应用程序。

有人知道解决方法吗?

首先想到的是使用PyQt5生成QPixmap,并让PySide从那里获取它,但是在测试时发现PyQt QPixmap与PySide不兼容。将整个脚本移植到PyQt也不是一个选项。

python pyside2
1个回答
0
投票

如果您可以通过PyQt5获得QPixmap,则可以将该信息转换为通用数据类型,作为可以被PySide2读取的字节:

import sys

from PySide2 import QtCore, QtGui, QtWidgets


def take_screenshot():
    from PyQt5 import QtCore as pyqt5c
    from PyQt5 import QtWidgets as pyqt5w

    screen = pyqt5w.QApplication.primaryScreen()
    winid = pyqt5w.QApplication.desktop().winId()
    pixmap = screen.grabWindow(winid)

    ba = pyqt5c.QByteArray()
    buff = pyqt5c.QBuffer(ba)
    pixmap.save(buff, "PNG")
    return ba.data()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    data = take_screenshot()

    pixmap = QtGui.QPixmap()
    pixmap.loadFromData(data)

    label = QtWidgets.QLabel()
    label.setPixmap(pixmap)
    label.show()

    sys.exit(app.exec_())
© www.soinside.com 2019 - 2024. All rights reserved.