PyQt5+Qt Designer如何實現不同對話方塊之間呼叫?
阿新 • • 發佈:2019-02-09
在學習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
步驟:
- 使用Qt designer建立所有需要的對話方塊;
- 將其所有對話方塊都儲存到指定目錄下,並命名為MainDialog.ui 和SubDialog.ui;
- 使用Pycharm中的PyUIC工具(不知道的可自己到網上查詢)將其MainDialog.ui 和SubDialog.ui轉為MainDialog.py和SubDialog.py;並編譯通過;
- 在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):