使用 PyQt4 或 PySide 捕获屏幕,特定小部件除外?

Capture Screen with PyQt4 or PySide, except specific widget?

我正在尝试捕获我的 pyqt4 应用程序半透明区域中的屏幕区域,但我想在捕获中排除小部件 "betwn = QPushButton('test')",我正在尝试使用 hide() 隐藏小部件像这样:betwn.hide(),为了在捕获之前被排除,但不起作用,即使隐藏的"betwn"也会被捕获。

这是我的 PyQt4 代码:

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from datetime import datetime

app = QApplication(sys.argv)
widget = QWidget()
widget.setLayout(QVBoxLayout())
widget.setAttribute(Qt.WA_TranslucentBackground)

label = QLabel()
widget.layout().addWidget(label)

def capture():
    p = QPixmap.grabWindow(QApplication.desktop().winId(),widget.geometry().x(),widget.geometry().y(),widget.geometry().width(),widget.geometry().height())
    label.setPixmap(p)
def shoot():
    betwn.hide()
    capture()
    betwn.show()
button = QPushButton('take screenshot', clicked=shoot)
betwn = QPushButton('test')
widget.layout().addWidget(button)
widget.layout().addWidget(betwn)

widget.show()
app.exec_()

这是我的 PySide 代码:

import sys
from PySide.QtGui import *
from PySide.QtCore import *
from datetime import datetime

app = QApplication(sys.argv)
widget = QWidget()
widget.setLayout(QVBoxLayout())
widget.setAttribute(Qt.WA_TranslucentBackground)

label = QLabel()
widget.layout().addWidget(label)

def capture():
    p = QPixmap.grabWindow(QApplication.desktop().winId(),widget.geometry().x(),widget.geometry().y(),widget.geometry().width(),widget.geometry().height())
    label.setPixmap(p)
def shoot():
    betwn.hide()
    capture()
    betwn.show()
button = QPushButton('take screenshot', clicked=shoot)
betwn = QPushButton('test')
widget.layout().addWidget(button)
widget.layout().addWidget(betwn)

widget.show()
app.exec_()

如何在捕获中排除小部件 "betwn = QPushButton('test')"?或者如果您知道使用 window 捕获桌面区域而不捕获 window 的其他方法,则使用 window 的坐标以及宽度和高度?

像这样:

QPixmap.grabWindow(QApplication.desktop().winId(),widget.geometry().x(),widget.geometry().y(),widget.geometry().width(),widget.geometry().height());

当你调用hide方法时,并不意味着按钮会在那一刻关闭,因为它涉及到同步任务结束后结束的重绘过程,在这些情况下你必须给Qt足够的时间做那项工作,那是可以做到的。做一个 QTimer::singleShot().

app = QApplication(sys.argv)
widget = QWidget()
widget.setLayout(QVBoxLayout())
widget.setAttribute(Qt.WA_TranslucentBackground)

label = QLabel()
widget.layout().addWidget(label)


def capture():
    p = QPixmap.grabWindow(
        QApplication.desktop().winId(), 
        *widget.geometry().getRect()
    )
    label.setPixmap(p)
    betwn.show()


def shoot():
    betwn.hide()
    QTimer.singleShot(1, capture)


button = QPushButton("take screenshot", clicked=shoot)
betwn = QPushButton("test")
widget.layout().addWidget(button)
widget.layout().addWidget(betwn)

widget.show()
sys.exit(app.exec_())