簡介
是對話窗口的基類,對話窗口是頂級窗口,主要用於短期任務和與用戶的簡短通信。
繼承自QWidget
創建
QDialog(parent: QWidget = None, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags())
# 代碼示例
window = QWidget()
qd = QDialog(window)
qd.resize(200, 100)
qd.open()
模態設置
在介紹模態設置之前首先認識什麼是“模態”;
模態對話框:模態對話框分爲應用級(默認值)和窗口級,應用級模態對話框,當該種模態的對話框出現時,用戶必須首先對對話框進行交互,直到關閉對話框,然後才能訪問程序中其他的窗口,其使用exec()進行窗口展示;
# 演示代碼
window = QWidget()
qd = QDialog()
qd.resize(200, 100)
qd.exec()
window.show()
窗口級模態對話框,該模態僅僅阻塞與對話框關聯的窗口,但是依然允許用戶與程序中其它窗口交互,其使用open()進行窗口展示;
# 演示代碼
window = QWidget()
qd = QDialog(window)
qd.resize(200, 100)
qd.open()
非模態對話框:不會阻塞與對話框關聯的窗口以及與其他窗口進行交互,使用show()進行窗口展示,可以結合使用方法setModal(True)來實現;
# 演示代碼
window = QWidget()
qd = QDialog(window)
qd.resize(200, 100)
qd.show()
window.show()
# 通過setModal(bool)方法設置模態
window = QWidget()
qd = QDialog(window)
qd.resize(200, 100)
qd.setModal(True)
qd.show()
window.show()
窗口彈出
# 窗口的彈出有三種方式
open()
exec()
show()
是否展示尺寸調整控件
# 是否展示尺寸調整控件
setSizeGripEnabled(bool)
常用操作槽
常用的操作槽accept()、reject()、done(int r)
# 演示代碼
window = QWidget()
qd = QDialog(window)
qd.setWindowTitle("對話框")
qd.resize(300, 300)
btn1 = QPushButton(qd)
btn1.setText("accept")
btn1.move(100, 50)
btn1.clicked.connect(lambda: qd.accept())
btn2 = QPushButton(qd)
btn2.setText("reject")
btn2.move(100, 100)
btn2.clicked.connect(lambda: qd.reject())
btn3 = QPushButton(qd)
btn3.setText("done")
btn3.move(100, 150)
btn3.clicked.connect(lambda: qd.done(2))
qd.show()
運行以上代碼展示的效果如下所示:
當我們選擇點擊以上的三個按鈕所觸發的效果都是一樣的,都會關閉對話框,他們的區別在於他們退出時返回的值不相同;
如何獲得其退出是返回的值呢?這裏使用exec()的展示方法,因爲這個展示方法會在對話框將值返回出來;
# 演示代碼
window = QWidget()
qd = QDialog(window)
qd.setWindowTitle("對話框")
qd.resize(300, 300)
btn1 = QPushButton(qd)
btn1.setText("accept")
btn1.move(100, 50)
btn1.clicked.connect(lambda: qd.accept())
btn2 = QPushButton(qd)
btn2.setText("reject")
btn2.move(100, 100)
btn2.clicked.connect(lambda: qd.reject())
btn3 = QPushButton(qd)
btn3.setText("done")
btn3.move(100, 150)
btn3.clicked.connect(lambda: qd.done(2))
result = qd.exec()
print(result)
# 點擊accept、reject、done按鈕時返回的值分別是1、0、2
我們很容易想到通過返回數值進行不同的操作;
設置和獲取數值
和以上的done()槽函數相同,直接設置返回值,但是不會關閉對話框;
# 代碼演示
window = QWidget()
qd = QDialog(window)
qd.setWindowTitle("對話框")
qd.resize(300, 300)
btn1 = QPushButton(qd)
btn1.setText("accept")
btn1.move(100, 50)
btn1.clicked.connect(lambda: qd.accept())
btn2 = QPushButton(qd)
btn2.setText("reject")
btn2.move(100, 100)
btn2.clicked.connect(lambda: qd.reject())
btn3 = QPushButton(qd)
btn3.setText("done")
btn3.move(100, 150)
btn3.clicked.connect(lambda: qd.done(2))
btn4 = QPushButton(qd)
btn4.setText("setResult")
btn4.move(100, 200)
btn4.clicked.connect(lambda: qd.setResult(100))
btn5 = QPushButton(qd)
btn5.setText("Result")
btn5.move(100, 250)
btn5.clicked.connect(lambda: print(qd.result()))
信號
# 擁有以下幾個信號
accepted()
finished(int result)
rejected()
# 代碼演示
window = QWidget()
qd = QDialog(window)
qd.setWindowTitle("對話框")
qd.resize(300, 300)
btn1 = QPushButton(qd)
btn1.setText("accept")
btn1.move(100, 50)
btn1.clicked.connect(lambda: qd.accept())
btn2 = QPushButton(qd)
btn2.setText("reject")
btn2.move(100, 100)
btn2.clicked.connect(lambda: qd.reject())
btn3 = QPushButton(qd)
btn3.setText("done")
btn3.move(100, 150)
btn3.clicked.connect(lambda: qd.done(2))
btn4 = QPushButton(qd)
btn4.setText("setResult")
btn4.move(100, 200)
btn4.clicked.connect(lambda: qd.setResult(100))
btn5 = QPushButton(qd)
btn5.setText("Result")
btn5.move(100, 250)
btn5.clicked.connect(lambda: print(qd.result()))
qd.accepted.connect(lambda: print("點擊了accept按鈕"))
# 點擊了accept按鈕
# 點擊了finish按鈕
qd.rejected.connect(lambda: print("點擊了reject按鈕"))
# 點擊了reject按鈕
# 點擊了finish按鈕
qd.finished.connect(lambda: print("點擊了finish按鈕"))
# 點擊了finish按鈕
result = qd.exec()
# print(result)
window.show()