Захват экрана с PyQt4 или PySide, кроме конкретного виджета? - PullRequest
2 голосов
/ 06 мая 2019

Я пытаюсь захватить область экрана в области моего приложения 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')" в захвате?или Если вы знаете другой способ захвата области рабочего стола, используя окно без захвата окна, используя координаты окна, а также ширину и высоту?

Примерно так:

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

1 Ответ

0 голосов
/ 06 мая 2019

Когда вы вызываете метод 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_())
...