调用QScreen.grabWindow()时键入错误

时间:2019-11-30 18:14:24

标签: python pyside2

我正在尝试使用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也不是一种选择。

2 个答案:

答案 0 :(得分:1)

我有点迟了,但是在使用QPixmap保存屏幕截图时遇到了类似的问题。我的解决方法是将winId转换为long int。

import maya.OpenMayaUI as _omui
from PySide2 import QtWidgets, QtGui
from shiboken2 import wrapInstance

def get_maya_main_window():
    win = _omui.MQtUtil_mainWindow()
    ptr = wrapInstance(long(win), QtWidgets.QMainWindow)
    return ptr

main_window_id = get_maya_main_window().winId()
long_win_id = long(main_window_id)

frame = QtGui.QPixmap.grabWindow(long_win_id)
path = <your-path-here>

frame.save(path)

答案 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_())