14 對(duì)話框類控件
《PyQt5快速開(kāi)發(fā)與實(shí)戰(zhàn)》學(xué)習(xí)筆記订雾。
對(duì)話框是一個(gè)現(xiàn)代 GUI 應(yīng)用不可或缺的一部分慈省。對(duì)話是兩個(gè)人之間的交流憔维,對(duì)話框就是人與電腦之間的對(duì)話炬守。對(duì)話框用來(lái)輸入數(shù)據(jù)牧嫉,修改數(shù)據(jù),修改應(yīng)用設(shè)置等等减途。
14.1 QDialog
為了更好地實(shí)現(xiàn)人機(jī)交互酣藻,比如 Windows 及 Linux 等系統(tǒng)均會(huì)提供一系列的標(biāo)準(zhǔn)對(duì)話框來(lái)完成特定場(chǎng)景下的功能,如選擇字號(hào)大小鳍置、字體顏色等辽剧。在 PyQt5 中定義了一系列的標(biāo)準(zhǔn)對(duì)話框類,讓使用者能夠方便和快捷地通過(guò)各個(gè)類完成字號(hào)大小税产、字體顏色以及文件的選擇等怕轿。
QDialog 類的子類主要有 QMessageBox坊夫、QFileDialog、QFontDialog撤卢、QInputDialog 等,QDialog類中的常用方法:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class DialogDemo(QMainWindow):
def __init__(self, parent=None):
super(DialogDemo, self).__init__(parent)
self.setWindowTitle("Dialog 例子")
self.resize(350, 300)
self.btn = QPushButton(self)
self.btn.setText("彈出對(duì)話框")
self.btn.move(50, 50)
self.btn.clicked.connect(self.showdialog)
def showdialog(self):
dialog = QDialog()
btn = QPushButton("ok", dialog)
btn.move(50, 50)
dialog.setWindowTitle("Dialog")
dialog.setWindowModality(Qt.ApplicationModal)
dialog.exec_()
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = DialogDemo()
demo.show()
sys.exit(app.exec_())
在這個(gè)例子中梧兼,Dialog 窗口的 WindowModality 屬性決定是否為模態(tài)或非模態(tài)放吩。當(dāng)用戶按下 Esc 鍵時(shí),對(duì)話框窗口將會(huì)默認(rèn)調(diào)用 QDialog.reject()
方法羽杰,然后關(guān)閉對(duì)話框窗口渡紫。
單擊 QWidget 窗口中的 PushButton 按鈕時(shí),將生成一個(gè)對(duì)話框窗口考赛。在對(duì)話框窗口的標(biāo)題欄上沒(méi)有最小化和最大化控件惕澎。以下代碼將給按鈕的clicked信號(hào)添加槽函數(shù)showdialog()。
self.btn.clicked.connect(self.showdialog)
由于 Dialog 窗口的 WindowModality 屬性設(shè)置為 Qt.ApplicationModal
模態(tài)颜骤,用戶只有關(guān)閉所彈出的對(duì)話框窗口后唧喉,才能關(guān)閉主窗口。以下代碼用于設(shè)置對(duì)話框模態(tài):
dialog.setWindowModality(Qt.ApplicationModal)
14.2 QMessageBox
QMessageBox 是一種通用的彈出式對(duì)話框忍抽,用于顯示消息八孝,允許用戶通過(guò)單擊不同的標(biāo)準(zhǔn)按鈕對(duì)消息進(jìn)行反饋。每個(gè)標(biāo)準(zhǔn)按鈕都有一個(gè)預(yù)定義的文本鸠项、角色和十六進(jìn)制數(shù)干跛。
QMessageBox 類提供了許多常用的彈出式對(duì)話框,如提示祟绊、警告楼入、錯(cuò)誤、詢問(wèn)牧抽、關(guān)于等對(duì)話框嘉熊。這些不同類型的 QMessageBox 對(duì)話框只是顯示時(shí)的圖標(biāo)不同,其他功能是一樣的阎姥。
QMessageBox 類中的常用方法:
QMessageBox 的標(biāo)準(zhǔn)按鈕類型:
5 種常用的消息對(duì)話框及其顯示效果:
QMessageBox 的使用:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class WinForm(QWidget):
def __init__(self):
super(WinForm, self).__init__()
self.setWindowTitle("QMessageBox 例子")
self.resize(300, 100)
self.myButton = QPushButton(self)
self.myButton.setText("點(diǎn)擊彈出消息框")
self.myButton.clicked.connect(self.msg)
def msg(self):
# 使用infomation信息框
reply = QMessageBox.information(
self, "標(biāo)題", "對(duì)話框消息正文", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
print(reply)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = WinForm()
demo.show()
sys.exit(app.exec_())
效果:
14.3 輸入文字
QInputDialog 提供了一個(gè)簡(jiǎn)單方便的對(duì)話框记舆,可以輸入字符串,數(shù)字或列表:
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit,
QInputDialog, QApplication)
import sys
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.btn = QPushButton('Dialog', self)
self.btn.move(20, 20)
self.btn.clicked.connect(self.showDialog)
self.le = QLineEdit(self)
self.le.move(130, 22)
self.setGeometry(300, 300, 290, 150)
self.setWindowTitle('Input dialog')
self.show()
def showDialog(self):
text, ok = QInputDialog.getText(self, 'Input Dialog',
'Enter your name:')
if ok:
self.le.setText(str(text))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
效果:
更加復(fù)雜的例子:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class InputdialogDemo(QWidget):
def __init__(self, parent=None):
super(InputdialogDemo, self).__init__(parent)
layout = QFormLayout()
self.btn1 = QPushButton("獲得列表里的選項(xiàng)")
self.btn1.clicked.connect(self.getItem)
self.le1 = QLineEdit()
layout.addRow(self.btn1, self.le1)
self.btn2 = QPushButton("獲得字符串")
self.btn2.clicked.connect(self.getIext)
self.le2 = QLineEdit()
layout.addRow(self.btn2, self.le2)
self.btn3 = QPushButton("獲得整數(shù)")
self.btn3.clicked.connect(self.getInt)
self.le3 = QLineEdit()
layout.addRow(self.btn3, self.le3)
self.setLayout(layout)
self.setWindowTitle("Input Dialog 例子")
def getItem(self):
items = ("C", "C++", "Java", "Python")
item, ok = QInputDialog.getItem(self, "select input dialog",
"語(yǔ)言列表", items, 0, False)
if ok and item:
self.le1.setText(item)
def getIext(self):
text, ok = QInputDialog.getText(self, 'Text Input Dialog', '輸入姓名:')
if ok:
self.le2.setText(str(text))
def getInt(self):
num, ok = QInputDialog.getInt(self, "integer input dualog", "輸入數(shù)字")
if ok:
self.le3.setText(str(num))
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = InputdialogDemo()
demo.show()
sys.exit(app.exec_())
14.4 選擇字體
QFontDialog 能做字體的選擇呼巴。
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class FontDialogDemo(QWidget):
def __init__(self, parent=None):
super(FontDialogDemo, self).__init__(parent)
layout = QVBoxLayout()
self.fontButton = QPushButton("choose font")
self.fontButton .clicked.connect(self.getFont)
layout.addWidget(self.fontButton)
self.fontLineEdit = QLabel("Hello,測(cè)試字體例子")
layout.addWidget(self.fontLineEdit)
self.setLayout(layout)
self.setWindowTitle("Font Dialog 例子")
def getFont(self):
font, ok = QFontDialog.getFont()
if ok:
self.fontLineEdit .setFont(font)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = FontDialogDemo()
demo.show()
sys.exit(app.exec_())
效果:
14.5 選擇文件
QFileDialog 是用于打開(kāi)和保存文件的標(biāo)準(zhǔn)對(duì)話框泽腮。QFileDialog 類繼承自 QDialog 類。QFileDialog 在打開(kāi)文件時(shí)使用了文件過(guò)濾器衣赶,用于顯示指定擴(kuò)展名的文件诊赊。也可以設(shè)置使用 QFileDialog 打開(kāi)文件時(shí)的起始目錄和指定擴(kuò)展名的文件。
QFileDialog類中的常用方法:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class filedialogdemo(QWidget):
def __init__(self, parent=None):
super(filedialogdemo, self).__init__(parent)
layout = QVBoxLayout()
self.btn = QPushButton("加載圖片")
self.btn.clicked.connect(self.getfile)
layout.addWidget(self.btn)
self.le = QLabel("")
layout.addWidget(self.le)
self.btn1 = QPushButton("加載文本文件")
self.btn1.clicked.connect(self.getfiles)
layout.addWidget(self.btn1)
self.contents = QTextEdit()
layout.addWidget(self.contents)
self.setLayout(layout)
self.setWindowTitle("File Dialog 例子")
def getfile(self):
fname, _ = QFileDialog.getOpenFileName(
self, 'Open file', 'c:\\', "Image files (*.jpg *.gif)")
self.le.setPixmap(QPixmap(fname))
def getfiles(self):
dlg = QFileDialog()
dlg.setFileMode(QFileDialog.AnyFile)
dlg.setFilter(QDir.Files)
if dlg.exec_():
filenames = dlg.selectedFiles()
f = open(filenames[0], 'r')
with f:
data = f.read()
self.contents.setText(data)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = filedialogdemo()
ex.show()
sys.exit(app.exec_())
效果:
14.6 選取顏色
QColorDialog 提供顏色的選擇:
from PyQt5.QtWidgets import (QWidget, QPushButton, QFrame,
QColorDialog, QApplication)
from PyQt5.QtGui import QColor
import sys
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
col = QColor(0, 0, 0)
self.btn = QPushButton('Dialog', self)
self.btn.move(20, 20)
self.btn.clicked.connect(self.showDialog)
self.frm = QFrame(self)
self.frm.setStyleSheet("QWidget { background-color: %s }"
% col.name())
self.frm.setGeometry(130, 22, 200, 200)
self.setGeometry(300, 300, 450, 350)
self.setWindowTitle('Color dialog')
self.show()
def showDialog(self):
col = QColorDialog.getColor()
if col.isValid():
self.frm.setStyleSheet('QWidget { background-color: %s }'
% col.name())
def main():
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
效果: