今天學習字體對話框——QFontDialog()控件。
QFontDialog()是繼承自QDialog()的一個子類,用來選擇給定的字體(包括字體、字號、樣式等)
一.構造函數
QFontDialog()的聲明很簡單,可以直接調用
fd = QFontDialog()
還有一種方法是可以指定默認字體的(啟用后Sample框里會按照指定的字體顯示)
font = QFont() font.setFamily('仿宋') font.setPointSize(24) fd = QFontDialog(font,self)
二.對話框的使用
在這里我們借用一個按鈕來啟動字體對話框,然后獲得對話框中選擇的字體。
這里有個知識點:我們在打開對話框的時候,用open()是可以傳遞一個槽函數的
QFontDialog.open(self, slot: PYQT_SLOT)
在對話框打開后,會自動連接fontSelected信號與此處指定的槽函數
方法1:利用open()函數,結合selectFont()函數
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.UI_test() def UI_test(self): btn = QPushButton('選擇字體',self) font = QFont() font.setFamily('仿宋') font.setPointSize(24) fd = QFontDialog(font,self) self.fd = fd btn.clicked.connect(lambda :fd.open(self.func)) pass def func(self,*args): print('字體選擇:',self.fd.selectedFont().family()) #獲取選擇的字體 if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
方案2:利用exec的返回值,結合selectFont()函數
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.UI_test() def UI_test(self): btn = QPushButton('選擇字體',self) fd = QFontDialog(self) def font_select(): if fd.exec(): print(fd.selectedFont().family()) btn.clicked.connect(font_select) pass if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
因為exec是有返回值的,只有點擊了OK才返回1,而取消和關閉都是返回0。只有確認選擇了才獲取字體。
三.選項設置
可以通過代碼對按鈕等選項進行設置
QFontDialog.setOption(self, option: 'QFontDialog.FontDialogOption', on: bool = ...) #FontDialogOption枚舉值 NoButtons # 不顯示確定取消按鈕(對實時的對話框有用) DontUseNativeDialog #在Mac上使用Qt的標准字體而不是Apple的原森字體 ScalableFonts #顯示可縮放字體 NonScalableFonts #顯示不可縮放字體 MonospacedFonts #顯示等寬字體 ProportionalFonts #顯示比例字體
我們可以試一下第一個方案,就是在一個實時對話框選擇不同字體然后在label里實時改變字體

from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.resize(800,500) self.UI_test() def UI_test(self): label = QLabel('字體',self) label.move(100,200) self.label = label btn = QPushButton('選擇字體',self) font = QFont() font.setFamily('仿宋') font.setPointSize(24) fd = QFontDialog(font,self) fd.setOption(QFontDialog.NoButtons) self.fd = fd btn.clicked.connect(lambda :fd.open(self.func)) pass fd.currentFontChanged.connect(self.label_font_change) def func(self,*args): print('字體選擇:',self.fd.selectedFont().family()) #獲取選擇的字體 def label_font_change(self,font): self.label.setFont(font) self.label.adjustSize() if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
當然,上面的枚舉值是可以用管道符‘|’連接同時使用的。
四.靜態方法使用
QFontDialog.getFont() #——>元組
我們先定義一個按鈕,按鈕連接這樣的槽函數
def func(self): result = QFontDialog.getFont() print(result) pass
每次調用槽函數會發現result是一個元組。元組里包含了一個字體對象還有一個布爾量。只有點擊確認鍵布爾量才為真。利用這個方法實現字體的靜態調整
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.resize(800,500) self.UI_test() def UI_test(self): label = QLabel('字體',self) label.move(100,200) self.label = label btn = QPushButton('選擇字體',self) btn.clicked.connect(self.func) def func(self): result = QFontDialog.getFont() if result[1]: self.label.setFont(result[0])
self.label.adjustSize() pass if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
getFont()還有一個高級一些的用法
QFontDialog(Font,parent,'對話框標題',字體過濾器)
五.信號
有兩個信號,一個是當前字體發生改變
QFontDialog.currentFontChanged(self, font: QtGui.QFont)
這個是只要選中的字體發生變化就發送信號(一般用在實時對話框中,上文中有案例)
QFontDialog.fontSelected(self, font: QtGui.QFont)
這個則是按下確定鍵時發送的信號。