Pyqt5 - Вернуться к скрытым MainWindows - PullRequest
0 голосов
/ 14 ноября 2018

Я делаю программу для указания конкретной области, используя pyqt5.Если я нажму на кнопку захвата, я скрою главное окно и покажу экран, чтобы указать область.Я хочу очистить экран и вернуться в главное окно, нажав клавишу Esc.Но MainWindow больше не отображается.Как мне работать?

form_class = uic.loadUiType("prototype.ui")[0]
class MainWindow(QtWidgets.QMainWindow, form_class) :
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.Capture_Button.clicked.connect(self.Capture_Btn_clicked)
        self.CaptureWindow = CaptureWidget()
        self.CaptureWindow.hide()

    def Capture_Btn_clicked(self) :
        self.hide()
        self.CaptureWindow.close()
        self.CaptureWindow.__init__()
        self.CaptureWindow.show()
        QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor)) 

    def enterEvent(self, QEvent):
         QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)) 
         self.setWindowOpacity(1)

Это класс, который определяет область (часть кода опущена).

class CaptureWidget(QtWidgets.QDialog):

    def __init__(self):
        super().__init__()
        root = tk.Tk()
        self.setupUi(self)

    def setupUi(self) :
        self.screen_width = root.winfo_screenwidth()
        self.screen_height = root.winfo_screenheight()
        self.setGeometry(0, 0, self.screen_width, self.screen_height)
        self.setWindowTitle(' ')
        self.begin = QtCore.QPoint()  
        self.end = QtCore.QPoint()
        self.setWindowOpacity(0.3) 
        QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor)) 
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint|QtCore.Qt.WindowStaysOnTopHint) 
        print('Capture the screen...')

        self.is_set_region = False 
        self.is_mouse_click = False
        self.show()    

    def keyPressEvent(self, event):
        key = event.key()
        if key == Qt.Key_Escape:

            print('esc')
            self.close()

        elif key == Qt.Key_F1:
            self.close()
            self.__init__()

1 Ответ

0 голосов
/ 14 ноября 2018

Прежде всего, вместо перезаписи метода keyPressEvent, проще использовать QShortcut. С другой стороны, для этого случая лучше создать сигнал, указывающий, когда нажата клавиша выхода, соединяющая его с методом show.

from PyQt5 import QtCore, QtGui, QtWidgets, uic

class CaptureWidget(QtWidgets.QDialog):
    escape_pressed = QtCore.pyqtSignal()

    def __init__(self):
        super().__init__()
        self.setupUi()

    def setupUi(self):
        self.setWindowOpacity(0.3) 
        QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor)) 
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint)
        shorcut_scaped = QtWidgets.QShortcut(QtCore.Qt.Key_Escape, self)
        shorcut_scaped.activated.connect(self.escape_pressed)
        shorcut_scaped.activated.connect(self.close)

        shorcut = QtWidgets.QShortcut(QtCore.Qt.Key_F1, self)
        shorcut.activated.connect(self.close)

form_class, _ = uic.loadUiType("prototype.ui")

class MainWindow(QtWidgets.QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.Capture_Button.clicked.connect(self.Capture_Btn_clicked)
        self.CaptureWindow = CaptureWidget()
        self.CaptureWindow.escape_pressed.connect(self.show)

    @QtCore.pyqtSlot()
    def Capture_Btn_clicked(self):
        self.hide()
        self.CaptureWindow.showFullScreen()
        QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor)) 

    def enterEvent(self, QEvent):
         QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)) 
         self.setWindowOpacity(1)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
...