QDialog - 如何在Python和PyQt中防止关闭

8
我有一个使用pyqt和python编写的登录屏幕对话框,它在运行时会显示一个对话框弹出,您可以在其中输入特定的用户名和密码以解锁它。这只是我在学习pyqt时制作的一个简单东西。我试图将其带到其他地方使用,但需要知道是否有一种方法可以防止某人使用x按钮关闭它,我也想让它始终置于所有窗口的顶部,这样它就不能被挪开?这可行吗?我做了一些研究,但找不到任何能帮助我的东西。
编辑:按要求提供代码:
from PyQt4 import QtGui

class Test(QtGui.QDialog):
     def __init__(self):
            QtGui.QDialog.__init__(self)
            self.textUsername = QtGui.QLineEdit(self)
            self.textPassword = QtGui.QLineEdit(self)
            self.loginbuton = QtGui.QPushButton('Test Login', self)
            self.loginbuton.clicked.connect(self.Login)
            layout = QtGui.QVBoxLayout(self)
            layout.addWidget(self.textUsername)
            layout.addWidget(self.textPassword)
            layout.addWidget(self.loginbuton)

    def Login(self):
           if (self.textUsername.text() == 'Test' and
               self.textPassword.text() == 'Password'):
               self.accept()
           else:
                 QtGui.QMessageBox.warning(
                 self, 'Wrong', 'Incorrect user or password')

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)

    if Test().exec_() == QtGui.QDialog.Accepted:
        window = Window()
        window.show()
        sys.exit(app.exec_())

你能贴一些代码吗? - user1786283
让我从我的树莓派上拿下来一秒钟。 - raspberry.pi
3个回答

17

首先坏消息是,根据 Riverbank邮件系统,无法从窗口中删除关闭按钮。

你无法移除或禁用关闭按钮,因为它由窗口管理器处理,Qt 在此无能为力。

好消息是,你可以覆盖和忽略关闭事件,这样当用户发送事件时,你可以忽略或放置一条消息。

阅读本文了解如何忽略 QCloseEvent

另外,查看这个问题:如何捕获 pyqt 的 closeEvent 并将对话框最小化到系统托盘而不是退出?

其中使用了以下内容:

class MyDialog(QtGui.QDialog):
    # ...
    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)

        # when you want to destroy the dialog set this to True
        self._want_to_close = False

    def closeEvent(self, evnt):
        if self._want_to_close:
            super(MyDialog, self).closeEvent(evnt)
        else:
            evnt.ignore()
            self.setWindowState(QtCore.Qt.WindowMinimized)

好的,谢谢。但我还有一个问题,您能否更新您的代码,使用户无法从框外单击,以便它显示在顶部并且您无法单击它? - raspberry.pi
@raspberry.pi 我已经没有时间编写代码了,但是你可以通过查看“pyqt窗口标志”来实现你想要的功能。 - user1786283
现在我遇到了一个问题,一个按钮覆盖了另一个按钮,我认为我使用了layout.add.Widget(self.closebutton)。 - raspberry.pi
我是指通过编程 - greendino
你可以禁用它们:https://stackoverflow.com/a/65125495/7426109 - undefined

7

您可以在PyQt5中禁用窗口按钮。

关键是将其与“CustomizeWindowHint”相结合,并排除您想要禁用的部分。

示例:

#exclude "QtCore.Qt.WindowCloseButtonHint" or any other window button

self.setWindowFlags(
    QtCore.Qt.Window |
    QtCore.Qt.CustomizeWindowHint |
    QtCore.Qt.WindowTitleHint |
    QtCore.Qt.WindowMinimizeButtonHint
    )

使用QDialog的结果: enter image description here

参考资料:https://doc.qt.io/qt-5/qt.html#WindowType-enum

提示:如果想要更改当前窗口的标志,需要在window.setWindowFlags后使用window.show(), 因为它需要刷新窗口,所以会调用window.hide()

在以下环境下测试了QtWidgets.QDialog Windows 10 x32, Python 3.7.9, PyQt5 5.15.1 。


1
“排除你想禁用的部分”是关键所在。 - mhucka
不错!对于 PyQt6,请使用 QtCore.Qt.WindowType.WindowMinimizeButtonHint - pangyuteng

3

我不知道你是否想这样做,但你也可以让窗口无边框。要使窗口无边框,请将窗口标志设置为QtCore.Qt.FramelessWindowHint


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接