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