1. 程式人生 > >PyQt5+Qt Designer如何實現不同對話方塊之間呼叫?

PyQt5+Qt Designer如何實現不同對話方塊之間呼叫?

在學習PyQt5+Qt Designer過程中,在QInputDialog對話方塊中或QMessageBox訊息框中,點選按鈕Button都會自動彈出一個對話方塊,這些對話方塊都是系統自帶的,現在我們需要自定義一個“彈出對話方塊”,參考了網上一些例子,可使用程式碼編寫的形式建立主視窗和子視窗,然後經過訊號和槽函式呼叫來實現,具體例項可參考:
1、各位大神,求問pyqt5如何實現點選一個按鈕跳出另一個視窗?
https://bbs.csdn.net/topics/390965991 此論壇中有幾個很好的例子。
2、【知乎網】https://zhuanlan.zhihu.com/p/30152208

但是對於複雜一點的應用系統,完全使用程式碼編寫太不現實,則需要使用快捷的建立方法,即使用Qt Designer建立主視窗和子視窗(被呼叫視窗),這時如何實現它們之間的呼叫?

下面給出它們之間的呼叫方法:
工具:PyQt5+Qt designer + Pycharm
步驟:

  1. 使用Qt designer建立所有需要的對話方塊;
  2. 將其所有對話方塊都儲存到指定目錄下,並命名為MainDialog.ui 和SubDialog.ui;
  3. 使用Pycharm中的PyUIC工具(不知道的可自己到網上查詢)將其MainDialog.ui 和SubDialog.ui轉為MainDialog.py和SubDialog.py;並編譯通過;
  4. 在Pycharm中新建一個Python File,命名為MyDialogCall.py,在檔案中新增如下程式碼實現呼叫功能:
from
PyQt5.QtWidgets import * import sys from MyMainDialog import Ui_Dialog from mySubDialog import Ui_Dialog2 class SubDialog(QDialog,Ui_Dialog2): def __init__(self): super(SubDialog,self).__init__() self.setupUi2(self) self.setWindowTitle("自定義訊息對話方塊:登入視窗") class MainDialog
(QDialog,Ui_Dialog):
def __init__(self): super(MessageDialog,self).__init__() self.setupUi(self) self.setWindowTitle("訊息對話方塊實驗") self.pushButton.clicked.connect(self.slotcalldialog) def slotcalldialog(self): #呼叫其他自定義訊息框 self.newDialog=SubDialog() self.newDialog.show() if __name__ == "__main__": app = QApplication(sys.argv) main = MainDialog() main.show() sys.exit(app.exec_())

結果圖:

【圖說明】
1)主對話方塊定義為訊息框,其中一個按鈕Other Infor可呼叫自定義對話方塊,(各位可建立一個簡單的視窗就一個按鈕即可),
2)在第3步中,MainDialog.py和SubDialog.py兩個檔案中的類名都一樣,都是如下形式:

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        .......................
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):

為了在MyDialogCall.py檔案中引用時不產生歧義,將子視窗檔案SubDialog.py對應的類名改為
from MyMainDialog import Ui_Dialog
from mySubDialog import Ui_Dialog2

class Ui_Dialog2(object):
    def setupUi2(self, Dialog):
        .......................
        self.retranslateUi2(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi2(self, Dialog):