Запрет закрытия окна Qt5
Как сделать, чтобы окно приложения не закрывалось по нажатию на крестик?
основной код main.py:
import os, zipfile
from shutil import rmtree
from time import sleep
from PyQt5 import QtCore, QtGui, QtWidgets
from blockd import Ui_dialog
import sys
#passwd = input(b"")
def unpack():
pathToArchive = 'C:\\Users\\Печка\\Desktop\\разное\\блокировщик код\\d.zip'
zipArchive = zipfile.ZipFile(pathToArchive, 'r')
unzippedFile = zipArchive.open('untitled.ui', 'r', passwd.encode('cp850', 'replace'))
content = unzippedFile.read()
f = open('C:\\Users\\Печка\\Desktop\\разное\\блокировщик код\\unititled.ui', 'wb')
f.write(content)
unzippedFile.close()
f.close()
def pack():
pass
def check():
pass
def desine():
app = QtWidgets.QApplication(sys.argv)
dialog = QtWidgets.QDialog()
ui = Ui_dialog()
ui.setupUi(dialog)
dialog.show()
sys.exit(app.exec_())
desine()
код файла blockd.py:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'blockd.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_dialog(object):
def setupUi(self, dialog):
dialog.setObjectName("dialog")
dialog.resize(400, 300)
dialog.setMinimumSize(QtCore.QSize(400, 300))
dialog.setMaximumSize(QtCore.QSize(400, 300))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("opera_gx_browser_logo_icon_152976.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
dialog.setWindowIcon(icon)
dialog.setStyleSheet("")
self.passb = QtWidgets.QPushButton(dialog)
self.passb.setGeometry(QtCore.QRect(14, 142, 371, 141))
self.passb.setCursor(QtGui.QCursor(QtCore.Qt.OpenHandCursor))
self.passb.setStyleSheet("QPushButton {\n"
"font: 30pt;\n"
"background-color: #001aff;\n"
"color: #04ff00;\n"
"border: none\n"
"}\n"
"QPushButton:pressed {\n"
"background-color: #f80;\n"
"color: #fff\n"
"}")
self.passb.setObjectName("passb")
self.label = QtWidgets.QLabel(dialog)
self.label.setGeometry(QtCore.QRect(20, 10, 141, 20))
self.label.setStyleSheet("color: #04ff00")
self.label.setObjectName("label")
self.log = QtWidgets.QLabel(dialog)
self.log.setGeometry(QtCore.QRect(30, 80, 221, 51))
self.log.setStyleSheet("color: #04ff00")
self.log.setText("")
self.log.setObjectName("log")
self.textBrowser = QtWidgets.QTextBrowser(dialog)
self.textBrowser.setGeometry(QtCore.QRect(-10, -10, 411, 321))
self.textBrowser.setStyleSheet("background-color: #000")
self.textBrowser.setInputMethodHints(QtCore.Qt.ImhHiddenText)
self.textBrowser.setFrameShape(QtWidgets.QFrame.NoFrame)
self.textBrowser.setPlaceholderText("")
self.textBrowser.setObjectName("textBrowser")
self.label_3 = QtWidgets.QLabel(dialog)
self.label_3.setGeometry(QtCore.QRect(320, 280, 101, 20))
self.label_3.setStyleSheet("color: #04ff00")
self.label_3.setObjectName("label_3")
self.passi = QtWidgets.QLineEdit(dialog)
self.passi.setGeometry(QtCore.QRect(20, 30, 361, 20))
self.passi.setStyleSheet("color: #04ff00;\n"
"background-color: #001aff;\n"
"border: none")
self.passi.setEchoMode(QtWidgets.QLineEdit.Password)
self.passi.setObjectName("passi")
self.textBrowser.raise_()
self.passb.raise_()
self.log.raise_()
self.label.raise_()
self.label_3.raise_()
self.passi.raise_()
self.retranslateUi(dialog)
QtCore.QMetaObject.connectSlotsByName(dialog)
def retranslateUi(self, dialog):
_translate = QtCore.QCoreApplication.translate
dialog.setWindowTitle(_translate("dialog", "opera locker by lerontick"))
self.passb.setText(_translate("dialog", "Войти"))
self.label.setText(_translate("dialog", "Введите пароль:"))
self.label_3.setText(_translate("dialog", "автор: lerontick"))
Ответы (2 шт):
Автор решения: gil9red
→ Ссылка
Это можно сделать через флаги виджета, попробуйте так:
dialog.setWindowFlags(QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowMinimizeButtonHint)
Автор решения: S. Nick
→ Ссылка
Приложение можно закрыть не только нажатием на крестик,
а еще и сочетание клавишь alt+F4, тоже приведет к закрытию приложения.
Я понял, что вы хотите запустить длительный процесс и чтобы пока он не закончит работу - окно нельзя никак позволить закрыть. Если я вас правильно понял, то попробуйте
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_dialog(object):
def setupUi(self, dialog):
dialog.setObjectName("dialog")
dialog.resize(400, 300)
dialog.setMinimumSize(QtCore.QSize(400, 300))
dialog.setMaximumSize(QtCore.QSize(400, 300))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("opera_gx_browser_logo_icon_152976.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
dialog.setWindowIcon(icon)
dialog.setStyleSheet("")
self.passb = QtWidgets.QPushButton(dialog)
self.passb.setGeometry(QtCore.QRect(14, 142, 371, 141))
self.passb.setCursor(QtGui.QCursor(QtCore.Qt.OpenHandCursor))
self.passb.setStyleSheet("QPushButton {\n"
"font: 30pt;\n"
"background-color: #001aff;\n"
"color: #04ff00;\n"
"border: none\n"
"}\n"
"QPushButton:pressed {\n"
"background-color: #f80;\n"
"color: #fff\n"
"}")
self.passb.setObjectName("passb")
self.label = QtWidgets.QLabel(dialog)
self.label.setGeometry(QtCore.QRect(20, 10, 141, 20))
self.label.setStyleSheet("color: #04ff00")
self.label.setObjectName("label")
self.log = QtWidgets.QLabel(dialog)
self.log.setGeometry(QtCore.QRect(30, 80, 221, 51))
self.log.setStyleSheet("color: #04ff00")
self.log.setText("")
self.log.setObjectName("log")
self.textBrowser = QtWidgets.QTextBrowser(dialog)
self.textBrowser.setGeometry(QtCore.QRect(-10, -10, 411, 321))
self.textBrowser.setStyleSheet("background-color: #000")
self.textBrowser.setInputMethodHints(QtCore.Qt.ImhHiddenText)
self.textBrowser.setFrameShape(QtWidgets.QFrame.NoFrame)
self.textBrowser.setPlaceholderText("")
self.textBrowser.setObjectName("textBrowser")
self.label_3 = QtWidgets.QLabel(dialog)
self.label_3.setGeometry(QtCore.QRect(320, 280, 101, 20))
self.label_3.setStyleSheet("color: #04ff00")
self.label_3.setObjectName("label_3")
self.passi = QtWidgets.QLineEdit(dialog)
self.passi.setGeometry(QtCore.QRect(20, 30, 361, 20))
self.passi.setStyleSheet("color: #04ff00;\n"
"background-color: #001aff;\n"
"border: none")
self.passi.setEchoMode(QtWidgets.QLineEdit.Password)
self.passi.setObjectName("passi")
self.textBrowser.raise_()
self.passb.raise_()
self.log.raise_()
self.label.raise_()
self.label_3.raise_()
self.passi.raise_()
self.retranslateUi(dialog)
QtCore.QMetaObject.connectSlotsByName(dialog)
def retranslateUi(self, dialog):
_translate = QtCore.QCoreApplication.translate
dialog.setWindowTitle(_translate("dialog", "opera locker by lerontick"))
self.passb.setText(_translate("dialog", "Войти"))
self.label.setText(_translate("dialog", "Введите пароль:"))
self.label_3.setText(_translate("dialog", "автор: lerontick"))
class Thread(QtCore.QThread):
threadSignal = QtCore.pyqtSignal(int)
finished = QtCore.pyqtSignal()
def __init__(self):
super().__init__()
self.num = 1000
def run(self):
while self.num: # имитация вашего длительного процесса
self.num -= 1
self.threadSignal.emit(self.num)
self.msleep(10)
self.finished.emit() # процесс завершен
class Dialog(QtWidgets.QDialog, Ui_dialog):
def __init__(self):
super().__init__()
self.setupUi(self)
self.flagClose = False
self.passb.clicked.connect(self.onClicked)
# тут ваша логика ...
def onClicked(self):
self.flagClose = True
self.passb.setText("Выполняется процесс - ожидайте... ")
self.passb.setStyleSheet("""
QPushButton {
font: 15pt;
background-color: #001aaa;
color: #ffff00;
}
""")
self.thread = Thread() # дополнительный поток для тяжелой задачи
self.thread.threadSignal.connect(lambda: print(self.thread.num))
self.thread.finished.connect(self._finished)
self.thread.start()
def _finished(self):
self.passb.setEnabled(False)
self.passb.setText("Войти")
self.passb.setStyleSheet("""
QPushButton {
font: 30pt;
background-color: #001aff;
color: #fff;
}
""")
self.passb.setEnabled(True)
self.flagClose = False
msg = QtWidgets.QMessageBox.information(
self,
'ВНИМАНИЕ',
'Процесс завершен - можете закрывать окно!'
)
def closeEvent(self, event):
if self.flagClose:
msg = QtWidgets.QMessageBox.information(
self,
'ВНИМАНИЕ',
'Не пытайтесь закрыть окно - выполняется процесс!'
)
event.ignore()
else:
event.accept()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
dialog = Dialog() #QtWidgets.QDialog()
#ui = Ui_dialog()
#ui.setupUi(dialog)
dialog.show()
sys.exit(app.exec_())
