簡體   English   中英

如何在 PyQt5 中的消息框后保持對話框打開?

[英]How to keep the dialog open after message box in PyQt5?

我有一個名為“第一頁”的 QmainWindow,它有兩個按鈕“登錄”和“注冊”。這兩個按鈕都會打開 Qdialogs。 在我的登錄對話框中,我有兩行接受用戶輸入的編輯和兩個按鈕“取消”和“確定”。 單擊“確定”時,我想檢查一些驗證,例如如果行編輯為空,則在對話框頂部顯示一個 QmessageBox,然后在用戶單擊消息框上的“確定”后關閉消息框。

我的問題:當消息框打開時,對話框關閉。 PS:我一直在通過修改我剛剛發現的 QtDesigner 代碼來實現我的代碼,這是最糟糕的事情。 所以我又做了一遍。 我當時沒有這個問題。

我的代碼:

import sys
from PyQt5 import QtWidgets as qtw 
from PyQt5 import QtCore as qtc 
from PyQt5 import QtGui as qtg 
from first_page import Ui_first_page
from signin_page import Ui_signin_page
from signup_page import Ui_signup_page

class SignIn(qtw.QDialog):

    def __init__(self, *args, **kwargs):
        """SignIn constructor."""
        super().__init__(*args, **kwargs)
        self.ui = Ui_signin_page()
        self.ui.setupUi(self)

        # Connects the function that inputs data for sign in to the OK button.
        self.ui.signin_buttons.accepted.connect(self.sign_in_authenticate)

    def sign_in_authenticate(self):
        """Inputs the user's username and password for sign in process and checks validations"""
        input_username = self.ui.signin_username_lineEdit.text()
        input_password = self.ui.signin_password_lineEdit.text()

        # Check if both are filled
        if input_username == "":
            #MY PROBLEM IS HERE
            qtw.QMessageBox.critical(self,"Note", "Please input your username.")

        elif input_password == "":
            qtw.QMessageBox.critical(self, "Note", "Please input your password.")

        else: 
            # Checks validations and opens mainpage
            open_main_page(self, username, status)

    def open_main_page(self, username, status):
        """ Opens the main page after sign in"""
        pass

class FirstPage(qtw.QMainWindow):
    def __init__(self, *args, **kwargs):
        """FirstPage constructor."""
        super().__init__(*args, **kwargs)

        self.ui = Ui_first_page()
        self.ui.setupUi(self)

        # Connecting the buttons to open Sign in and Sign out pages
        self.ui.first_page_sign_in_button.clicked.connect(self.open_sign_in_page)
        self.ui.first_page_sign_up_button.clicked.connect(self.open_sign_up_page)

        self.show()

    def open_sign_in_page(self):
        self.sigin = SignIn()
        self.sigin.show()

    def open_sign_up_page(self):
        self.signup = SignUp()
        self.signup.show()


class SignUp(qtw.QDialog):
#Doesn't do anything yet.
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.ui = Ui_signup_page()
        self.ui.setupUi(self)

    
if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    window = FirstPage()
    sys.exit(app.exec_())

我很新,所以如果我做錯了什么,請指出。 提前致謝。

我的問題的小例子:

主要代碼:

import sys
from PyQt5 import QtWidgets as qtw 
from PyQt5 import QtCore as qtc 
from PyQt5 import QtGui as qtg 
from mainwindow import Ui_MainWindow
from dialog import Ui_signin_Dialog

class SignIn(qtw.QDialog):

    def __init__(self, *args, **kwargs):
        """SignIn constructor."""
        super().__init__(*args, **kwargs)
        self.ui = Ui_signin_Dialog()
        self.ui.setupUi(self)

        # Connects the function that inputs data for sign in to the OK button.
        self.ui.signin_buttonBox.accepted.connect(self.sign_in_authenticate)

    def sign_in_authenticate(self):
        input_text = self.ui.input_lineEdit.text()

        if input_text == "":
            qtw.QMessageBox.critical(self,"Note", "Please input your data.")


class FirstPage(qtw.QMainWindow):
    def __init__(self, *args, **kwargs):
        """FirstPage constructor."""
        super().__init__(*args, **kwargs)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Connecting the buttons to open Sign in and Sign out pages
        self.ui.signin_pushButton.clicked.connect(self.open_sign_in_page)

        self.show()

    def open_sign_in_page(self):
        self.sigin = SignIn()
        self.sigin.show()

if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    window = FirstPage()
    sys.exit(app.exec_())

用戶界面主窗口:

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(311, 293)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.signin_pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.signin_pushButton.setGeometry(QtCore.QRect(100, 110, 89, 25))
        self.signin_pushButton.setObjectName("signin_pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 311, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.signin_pushButton.setText(_translate("MainWindow", "Sign in "))

Ui_signin_Dialog

class Ui_signin_Dialog(object):
    def setupUi(self, signin_Dialog):
        signin_Dialog.setObjectName("signin_Dialog")
        signin_Dialog.resize(400, 300)
        self.signin_buttonBox = QtWidgets.QDialogButtonBox(signin_Dialog)
        self.signin_buttonBox.setGeometry(QtCore.QRect(290, 230, 80, 56))
        self.signin_buttonBox.setOrientation(QtCore.Qt.Vertical)
        self.signin_buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.signin_buttonBox.setObjectName("signin_buttonBox")
        self.input_lineEdit = QtWidgets.QLineEdit(signin_Dialog)
        self.input_lineEdit.setGeometry(QtCore.QRect(140, 130, 113, 25))
        self.input_lineEdit.setObjectName("input_lineEdit")

        self.retranslateUi(signin_Dialog)
        self.signin_buttonBox.accepted.connect(signin_Dialog.accept)
        self.signin_buttonBox.rejected.connect(signin_Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(signin_Dialog)

    def retranslateUi(self, signin_Dialog):
        _translate = QtCore.QCoreApplication.translate
        signin_Dialog.setWindowTitle(_translate("signin_Dialog", "Dialog"))

我希望 Qmessagebox 像彈出消息一樣打開而不是關閉對話框。

嘗試一下:

import sys
from PyQt5 import QtWidgets as qtw 
from PyQt5 import QtCore as qtc 
from PyQt5 import QtGui as qtg 
from PyQt5 import QtCore, QtGui, QtWidgets                                 # +++


#from mainwindow import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(311, 293)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.signin_pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.signin_pushButton.setGeometry(QtCore.QRect(100, 110, 89, 25))
        self.signin_pushButton.setObjectName("signin_pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 311, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.signin_pushButton.setText(_translate("MainWindow", "Sign in "))
        
        
#from dialog import Ui_signin_Dialog
class Ui_signin_Dialog(object):
    def setupUi(self, signin_Dialog):
        signin_Dialog.setObjectName("signin_Dialog")
        signin_Dialog.resize(400, 300)
        self.signin_buttonBox = QtWidgets.QDialogButtonBox(signin_Dialog)
        self.signin_buttonBox.setGeometry(QtCore.QRect(290, 230, 80, 56))
        self.signin_buttonBox.setOrientation(QtCore.Qt.Vertical)
        self.signin_buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.signin_buttonBox.setObjectName("signin_buttonBox")
        self.input_lineEdit = QtWidgets.QLineEdit(signin_Dialog)
        self.input_lineEdit.setGeometry(QtCore.QRect(140, 130, 113, 25))
        self.input_lineEdit.setObjectName("input_lineEdit")

        self.retranslateUi(signin_Dialog)
#        self.signin_buttonBox.accepted.connect(signin_Dialog.accept)           # ---
        self.signin_buttonBox.rejected.connect(signin_Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(signin_Dialog)

    def retranslateUi(self, signin_Dialog):
        _translate = QtCore.QCoreApplication.translate
        signin_Dialog.setWindowTitle(_translate("signin_Dialog", "Dialog"))
        

class SignIn(qtw.QDialog):

    def __init__(self, *args, **kwargs):
        """SignIn constructor."""
        super().__init__(*args, **kwargs)
        self.ui = Ui_signin_Dialog()
        self.ui.setupUi(self)

        # Connects the function that inputs data for sign in to the OK button.
        self.ui.signin_buttonBox.accepted.connect(self.sign_in_authenticate)

    def sign_in_authenticate(self):
        input_text = self.ui.input_lineEdit.text()
        
        if input_text == "":
            qtw.QMessageBox.critical(self,"Note", "Please input your data.")
        else:                                                                   # +++
            self.accept()                                                       # +++


class FirstPage(qtw.QMainWindow):
    def __init__(self, *args, **kwargs):
        """FirstPage constructor."""
        super().__init__(*args, **kwargs)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Connecting the buttons to open Sign in and Sign out pages
        self.ui.signin_pushButton.clicked.connect(self.open_sign_in_page)

        self.show()

    def open_sign_in_page(self):
        self.sigin = SignIn()
        self.sigin.show()

if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    window = FirstPage()
    sys.exit(app.exec_())

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM