在嗶哩嗶哩中看的教程整理的筆記:視頻鏈接https://www.bilibili.com/video/BV1VE411t7kC?p=1 目錄 一.水平布局 二.垂直布局 三.Grid 柵格布局 四. form表單布局 五.組合垂直和水平布局 六.絕對(duì)布局 七.分割線與間隙 八.控件尺寸的最大值與最小值 九.尺寸策略(sizePolicy) 十.伙伴關(guān)系 十一.Tab順序 十二.信號(hào)和槽 十三 . 添加菜單欄與工具欄 十四.使用python代碼編寫 十五.讓主窗口居中顯示 十六.點(diǎn)擊按鈕退出應(yīng)用程序 十七.屏幕坐標(biāo)系 十八.設(shè)置窗口和應(yīng)用程序圖標(biāo) 十九.為控件添加提示消息 二十.QLabel控件的基本用法 二十一. QLabel與伙伴控件 二十二.限制QLineEdit控件的輸入 二十三.QLineEdit綜合案例 二十四.QTextEdit控制輸入多行文本 二十五. 按鈕控件 二十六.使用QDialog顯示通用對(duì)話框 二十七.顯示不同類型的消息對(duì)話框 二十八.顯示不同類型的消息對(duì)話框 二十九.文件對(duì)話框 三十.選項(xiàng)卡控件 三十一.堆棧窗口控件 三十二.??靠丶?/p> 三十三.容納多文檔的窗口 一.水平布局 兩種方法: 1.選中控件——》右鍵布局——》水平布局 2.layout的horizontal ——》將部件拖進(jìn)去 設(shè)計(jì)的ui程序只是設(shè)計(jì)的,要真正在程序中調(diào)用要轉(zhuǎn)換成.py文件 方法三:在pycharm中設(shè)置(拓展工具中設(shè)置PyUIC,具體設(shè)置方法自行查找) 二.垂直布局 三.Grid 柵格布局 N行m列 四. form表單布局 N行兩列 左側(cè)一般是標(biāo)簽,右邊一般是采集用戶輸入的 五.組合垂直和水平布局 圖中備注為label形式 下面的文本框?yàn)閘ine Edit形式 Ctrl+方向鍵 微調(diào) 六.絕對(duì)布局 七.分割線與間隙 屬性在goemotry中查看 spacer 添加加空隙 水平的話,先調(diào)整為水平布局,將Horizontal spacer拖入水平布局內(nèi)——》選中間隙,——》spacer中選中sizeType中的Fixed ——》可以設(shè)置寬度,垂直的可以設(shè)置高度 2. 添加間隔線 在Displace Widgets中的 Vertiacl Line與Horizontal Line 八.控件尺寸的最大值與最小值 minimumsize最小 maximumsize 最大 設(shè)置一個(gè)控件最大最小的尺寸 九.尺寸策略(sizePolicy) SizeHint(期望尺寸) 默認(rèn)尺寸,對(duì)于大多數(shù)控件來說,SizeHint不可修改,只讀。 讀取SizeHint的方法如圖: 舉例:設(shè)置如下界面 首先選擇一個(gè)水平布局——》然后在水平布局左側(cè)添加一個(gè)Tree View(Item Views中) ,右側(cè)加一個(gè)frame面板(Containers中),——>然后設(shè)置為1:1:2的水平比例,——》然后在右側(cè)加入表單布局,form layout,再往form layout中拖動(dòng)label與line text 十.伙伴關(guān)系 兩個(gè)控件的關(guān)聯(lián)關(guān)系 菜單顯示時(shí)按熱鍵才起作用,相當(dāng)于另外一種快捷鍵。 效果: 當(dāng)鍵盤輸入ait+a 時(shí)光標(biāo)顯示在姓名后的文本框,不區(qū)分大小寫 alt+b光標(biāo)定位在身份證后 代碼也可以實(shí)現(xiàn)兩個(gè)控件的伙伴關(guān)系(以后講) 十一.Tab順序 按Tab鍵之后,光標(biāo)在輸入框中的跳轉(zhuǎn)順序 方法一:右鍵 方法二:直接點(diǎn)框內(nèi)數(shù)字 十二.信號(hào)和槽 信號(hào)(signal)與槽(slot)是qt的核心機(jī)制,也是Pyqt的核心機(jī)制。 信號(hào):是由對(duì)象或控件發(fā)射出去的消息 按鈕的單擊事件:當(dāng)單擊按鈕時(shí),按鈕就會(huì)向外部發(fā)送單擊的消息,這些發(fā)送出去的信號(hào)需要一些代碼來攔截,這些代碼就槽。 槽:本質(zhì)上是一個(gè)函數(shù)或方法,信號(hào)可以理解為事件函數(shù) 需要將信號(hào)與槽綁定,一個(gè)信號(hào)可以和多個(gè)槽綁定,一個(gè)槽可以攔截多個(gè)信號(hào) 例1:功能:實(shí)現(xiàn)點(diǎn)擊按鈕,關(guān)閉窗口 (1)先創(chuàng)建一個(gè)按鈕,再設(shè)置信號(hào)/槽 注: 可恢復(fù)窗口,即重新編輯(刪除控件等操作) 例2:功能:實(shí)現(xiàn)輸入框的顯示與隱藏,以及文本輸入框的可用與不可用 效果如下圖: 1.首先設(shè)置隱藏于顯示這兩個(gè)控件 (1)設(shè)計(jì)出界面:復(fù)選框和文本輸入框 (2)修改復(fù)選框默認(rèn)為選中狀態(tài) ,即默認(rèn)為 (3)設(shè)計(jì)信號(hào)/槽關(guān)系 2.設(shè)置這兩個(gè)控件 (1)設(shè)計(jì)出界面:復(fù)選框和文本輸入框 (2)將文本框默認(rèn)設(shè)置為不可用 ,即文本輸入框顯示為灰色 (3)設(shè)計(jì)信號(hào)/槽關(guān)系 最終效果如下: 單擊(clicked)事件與close方法想關(guān)聯(lián)。 十三 . 添加菜單欄與工具欄 如何創(chuàng)建菜單欄與工具欄,并且往菜單欄和工具欄添加菜單和按鈕 1.狀態(tài)欄 主窗口最下面的狀態(tài)欄,默認(rèn)是有的 2.菜單欄 點(diǎn)擊菜單欄——》右鍵移除 3,工具欄 (1)添加工具欄——》右鍵 (2)打開動(dòng)作編輯器,選中要放入工具欄的動(dòng)作,從動(dòng)作編輯器中拖至工具欄。 效果 十四.使用python代碼編寫 主窗口的類型:有三種窗口 QMainWindow:可以包含菜單欄、工具欄和標(biāo)題欄,是最常見的窗口形式 QDialog:是對(duì)話窗口的基類。沒有菜單欄、工具欄和標(biāo)題欄 QWidget:不確定窗口的用途,就使用QWidget。 我們一般會(huì)使用QMainWindow,在QMainWindow里面使用QDialog,偶爾使用QWidget。 效果: 代碼: ''' 面向?qū)ο蟮姆绞剑瑢⑺信cui有關(guān)的代碼都放進(jìn)一個(gè)類里面, 然后創(chuàng)建一個(gè)窗口,只要?jiǎng)?chuàng)建這個(gè)類的子類即可 ''' import sys from PyQt5.QtWidgets import QApplication , QMainWindow from PyQt5.QtGui import QIcon class FirstMainWin(QMainWindow): def __init__(self,parent=None): super(FirstMainWin,self).__init__(parent) #設(shè)置主窗口的標(biāo)題 self.setWindowTitle("第一個(gè)主窗口應(yīng)用") #設(shè)置窗口的尺寸 self.resize(400,300) self.status = self.statusBar() self.status.showMessage('只存在5秒的消息',5000) if __name__ == '__main__': app = QApplication(sys.argv) #app.setWindowIcon(QIcon('E:/PycharmProjects/doutula/pyqt5_/controls/images/t10.ico')) app.setWindowIcon(QIcon('./images/t10.ico')) main = FirstMainWin() main.show() sys.exit(app.exec_()) 十五.讓主窗口居中顯示 窗口默認(rèn)也為居中,因此我認(rèn)為此節(jié)不是很重,但是還是記錄一下方法。 #得這整個(gè)屏幕的尺寸,和整個(gè)窗口的尺寸,然后用整個(gè)屏幕的尺寸減去整個(gè)窗口的尺寸 import sys from PyQt5.QtWidgets import QApplication, QMainWindow,QDesktopWidget from PyQt5.QtGui import QIcon class CenterForm(QMainWindow): def __init__(self, parent=None): super(CenterForm, self).__init__(parent) # 設(shè)置主窗口的標(biāo)題 self.setWindowTitle("讓窗口居中") # 設(shè)置窗口的尺寸 self.resize(400, 300) print("初始化") def center(self): #獲取屏幕坐標(biāo)系 screen = QDesktopWidget().screenGeometry() #獲取窗口坐標(biāo)系 size = self.geometry() newLeft = (screen.width()-size.width())/2 newTop = (screen.height() - size.height()) / 2 #調(diào)用move的方法來移動(dòng)窗口 self.move(newLeft,newTop) print("移動(dòng)窗口") if __name__ == '__main__': app = QApplication(sys.argv) c = CenterForm() #main = CenterForm.center(c) #不調(diào)用此函數(shù),窗口依然可以居中 main.show() sys.exit(app.exec_()) 十六.點(diǎn)擊按鈕退出應(yīng)用程序 import sys from PyQt5.QtWidgets import QPushButton,QHBoxLayout,QWidget,QApplication, QMainWindow,QDesktopWidget from PyQt5.QtGui import QIcon class QuitApplication(QMainWindow): #點(diǎn)擊按鈕,退出應(yīng)用程序 def __init__(self): super(QuitApplication, self).__init__() self.resize(300,120) self.setWindowTitle("退出應(yīng)用程序") #添加Button self.button1 = QPushButton("退出程序") #將button與槽綁定 self.button1.clicked.connect(self.onClick_Button) #創(chuàng)建水平布局 layout = QHBoxLayout() layout.addWidget(self.button1) #把button1放在水平布局是哪個(gè) #把水平布局放在主框架上 mainFrame = QWidget() #讓充滿屏幕 mainFrame.setLayout(layout) self.setCentralWidget(mainFrame) #讓主框架放在整個(gè)窗口上 #按鈕單擊事件的方法(自定義的槽) def onClick_Button(self): sender = self.sender() #通過sender獲得button print(sender.text()+ " 按鈕被按下") #sender.text()是讀取按鈕上的內(nèi)容 app = QApplication.instance() #得到一個(gè)實(shí)例 #退出應(yīng)用程序 app.quit() if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = QuitApplication() main.show() sys.exit(app.exec_()) 點(diǎn)擊按鈕后,窗口關(guān)閉,并且命令行顯示 十七.屏幕坐標(biāo)系 屏幕左上角坐標(biāo)是(0,0) 工作區(qū)高度:窗口高度(不包括標(biāo)簽欄) 標(biāo)簽欄高度:標(biāo)簽欄坐標(biāo)減去工作區(qū)坐標(biāo) widget.resize(300,240) 設(shè)置的是工作區(qū)的尺寸 注意區(qū)分三者坐標(biāo)的不同,詳解見代碼注釋。 import sys from PyQt5.QtWidgets import QPushButton,QHBoxLayout,QWidget,QApplication, QMainWindow,QDesktopWidget from PyQt5.QtGui import QIcon #此例子中使用面向過程的方式,不使用類了 def onClick_Button(): print("含邊框的坐標(biāo)") print("widget.x()= %d" % widget.x()) #含有邊框的坐標(biāo) 250(窗口橫坐標(biāo)) print("widget.y()= %d" % widget.y()) #200(窗口縱坐標(biāo)) print("widget.width()= %d" % widget.width()) #300(工作區(qū)寬度) print("widget.height() = %d" % widget.height())#240(工作區(qū)高度) print("工作區(qū)的坐標(biāo)") print("widget.geometry().x()= %d" % widget.geometry().x()) #工作區(qū)的坐標(biāo)系,不包含標(biāo)題欄 251(工作區(qū)橫坐標(biāo)) print("widget.geometry().y()= %d" % widget.geometry().y()) #231(工作區(qū)縱坐標(biāo)) print("widget.geometry().width()= %d" % widget.geometry().width()) #300(工作區(qū)寬度) print("widget.geometry().height() = %d" % widget.geometry().height())#240(工作區(qū)高度) print("框架的坐標(biāo)") print("widget.frameGeometry().x()= %d" % widget.frameGeometry().x()) #250(窗口橫坐標(biāo)) print("widget.frameGeometry().y()= %d" % widget.frameGeometry().y()) #200(窗口縱坐標(biāo)) print("widget.frameGeometry().width()= %d" % widget.frameGeometry().width()) #302(窗口寬度) print("widget.frameGeometry().height() = %d" % widget.frameGeometry().height()) #272(窗口高度 =標(biāo)題欄高度+工作區(qū)高度) app = QApplication(sys.argv) widget = QWidget() btn = QPushButton(widget) btn.setText("按鈕") btn.clicked.connect(onClick_Button) btn.move(24,52) widget.resize(300,240) #設(shè)置工作區(qū)的尺寸 widget.move(250,200) widget.setWindowTitle("屏幕坐標(biāo)系") widget.show() sys.exit(app.exec_()) 點(diǎn)擊按鈕后輸出: 十八.設(shè)置窗口和應(yīng)用程序圖標(biāo) 窗口的setWindowIcon方法用于設(shè)置主窗口的圖標(biāo)和應(yīng)用程序圖標(biāo),只在Windows可用 QApplication中的setWindowIcon方法也用于設(shè)置主窗口的圖標(biāo)和應(yīng)用程序圖標(biāo), 但調(diào)用了窗口的setWindowIcon方法,QApplication中的setWindowIcon方法就不起作用了 (與老師講的有些出入,但是還是以運(yùn)行結(jié)果為準(zhǔn)) import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtGui import QIcon ''' 窗口的setWindowIcon方法用于設(shè)置主窗口的圖標(biāo)和應(yīng)用程序圖標(biāo),只在Windows可用 QApplication中的setWindowIcon方法也用于設(shè)置主窗口的圖標(biāo)和應(yīng)用程序圖標(biāo), 但調(diào)用了窗口的setWindowIcon方法,QApplication中的setWindowIcon方法就不起作用了 ''' class IconForm(QMainWindow): def __init__(self): super(IconForm, self).__init__() self.initUI() def initUI(self): self.setGeometry(300,300,250,250) # 設(shè)置主窗口的標(biāo)題 self.setWindowTitle("設(shè)置窗口圖標(biāo)") #設(shè)置窗口圖標(biāo) self.setWindowIcon(QIcon('./images/t10.ico')) if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('E:/PycharmProjects/doutula/pyqt5_/controls/images/t12.ico')) main = IconForm() main.show() sys.exit(app.exec_()) 運(yùn)行結(jié)果: 十九.為控件添加提示消息 鼠標(biāo)放在工作區(qū)就會(huì)出現(xiàn)提醒信息 #為控件添加提示信息 import sys from PyQt5.QtWidgets import QHBoxLayout,QWidget,QToolTip,QPushButton,QApplication, QMainWindow from PyQt5.QtGui import QIcon from PyQt5.QtGui import QFont class TooltipForm(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): QToolTip.setFont(QFont("SanSerif",12))#設(shè)置字體與大小 self.setToolTip("今天是<b>星期五</b>") #設(shè)置提示信息為粗體 self.setGeometry(300,300,400,300) self.setWindowTitle("設(shè)置控件提示消息") if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = TooltipForm() main.show() sys.exit(app.exec_()) 效果: #為控件添加提示信息 import sys from PyQt5.QtWidgets import QHBoxLayout,QWidget,QToolTip,QPushButton,QApplication, QMainWindow from PyQt5.QtGui import QIcon from PyQt5.QtGui import QFont class TooltipForm(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): QToolTip.setFont(QFont("SanSerif",12))#設(shè)置字體與大小 self.setToolTip("今天是<b>星期五</b>") #設(shè)置提示信息為粗體 self.setGeometry(300,300,400,300) self.setWindowTitle("設(shè)置控件提示消息") # 添加Button self.button1 = QPushButton("我的按鈕") self.button1.setToolTip("這是一個(gè)按鈕") # 創(chuàng)建水平布局 layout = QHBoxLayout() layout.addWidget(self.button1) # 把button1放在水平布局是哪個(gè) # 把水平布局放在主框架上 mainFrame = QWidget() # 讓充滿屏幕 mainFrame.setLayout(layout) self.setCentralWidget(mainFrame) # 讓主框架放在整個(gè)窗口上 if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = TooltipForm() main.show() sys.exit(app.exec_()) 效果: 二十.QLabel控件的基本用法 setAlignment():設(shè)置文本的對(duì)齊方式 setIndent(): 設(shè)置文本縮進(jìn) text(): 獲取文本內(nèi)容 setBuddy(): 設(shè)置伙伴關(guān)系 setText():設(shè)置文本內(nèi)容 selectText():返回所選擇的字符 setWordWrap():設(shè)置是否允許換行 ''' setAlignment():設(shè)置文本的對(duì)齊方式 setIndent(): 設(shè)置文本縮進(jìn) text(): 獲取文本內(nèi)容 setBuddy(): 設(shè)置伙伴關(guān)系 setText():設(shè)置文本內(nèi)容 selectText():返回所選擇的字符 setWordWrap():設(shè)置是否允許換行 QLabel常用的信號(hào)(事件): 1.當(dāng)鼠標(biāo)滑過QLabel控件時(shí)觸發(fā):linkHovered 2.當(dāng)鼠標(biāo)單擊QLabel控件時(shí)觸發(fā):linkActivated ''' import sys from PyQt5.QtWidgets import QLabel,QVBoxLayout,QWidget,QToolTip,QPushButton,QApplication, QMainWindow from PyQt5.QtGui import QIcon from PyQt5.QtGui import QPalette,QPixmap from PyQt5.QtCore import Qt class QLabelDemo(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): #創(chuàng)建label label1 = QLabel(self) label2 = QLabel(self) label3 = QLabel(self) label4 = QLabel(self) label1.setText("<font color = yellow>這是一個(gè)文本標(biāo)簽(label1).</font>") label1.setAutoFillBackground(True) #背景自動(dòng)填充 palette = QPalette() #填充 palette.setColor(QPalette.Window,Qt.blue) #設(shè)置label背景顏色 label1.setPalette(palette) #調(diào)試板 label1.setAlignment(Qt.AlignCenter) #設(shè)置文字的對(duì)齊方式,文本居中對(duì)齊 label2.setText("<a href= '#'>歡迎使用Python (label2)</a>") label3.setAlignment(Qt.AlignCenter) label3.setToolTip("這是一個(gè)圖片標(biāo)簽(label2)") label3.setPixmap(QPixmap("./images/4.jpg")) #label4,要么觸發(fā)單擊事件,要么鏈接,只能二者選其一 #如果設(shè)為True用瀏覽器打開網(wǎng)頁,如果設(shè)為False,調(diào)用槽函數(shù) label4.setOpenExternalLinks(True) label4.setText("<a href= 'https://www.baidu.com/'> 感謝使用百度(label4) </a>") label4.setAlignment(Qt.AlignRight) label4.setToolTip("這是一個(gè)超級(jí)鏈接") #垂直布局 vbox = QVBoxLayout() vbox.addWidget(label1) vbox.addWidget(label2) vbox.addWidget(label3) vbox.addWidget(label4) #將linkHovered信號(hào)綁定到self.linkHovered槽函數(shù)上 label2.linkHovered.connect(self.linkHovered) #滑過事件 label4.linkActivated.connect(self.linkClicked) #單擊事件 self.setLayout(vbox) #設(shè)置布局 self.setWindowTitle("QLabel控件演示") def linkHovered(self): print("當(dāng)鼠標(biāo)滑過label2標(biāo)簽時(shí),觸發(fā)條件") def linkClicked(self): print("當(dāng)鼠標(biāo)滑過label4標(biāo)簽時(shí),觸發(fā)條件") if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = QLabelDemo() main.show() sys.exit(app.exec_()) 效果: 二十一. QLabel與伙伴控件 熱鍵:ALT+() mainLayout.addWidget(控件名,控件位置行索引,控件位置行索引,控件占幾行,控件占幾列) #柵格布局 mainLayout = QGridLayout(self) mainLayout.addWidget(nameLabel,0,0) #(0,0)表示放在一行一列 mainLayout.addWidget(nameLineEdit,0,1,1,2)#(0,1,1,2)表示放在第一行的第二列,占1行兩列 mainLayout.addWidget(passwordLabel,1,0) #(1,0)表示第二行第一列 mainLayout.addWidget(passwordLineEdit,1,1,1,2) #(1,1,1,2)表示在第二行的第二列,占一行兩列 ''' QLabel與伙伴控件 mainLayout.addWidget(控件名,控件位置行索引,控件位置行索引,控件占幾行,控件占幾列) ''' from PyQt5.QtWidgets import * import sys from PyQt5.QtGui import QIcon class QLabelBuddy(QDialog) : def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle("QLabel與伙伴控件") #創(chuàng)建兩個(gè)控件 nameLabel = QLabel('&Name',self) nameLineEdit = QLineEdit(self) #設(shè)置伙伴控件 nameLabel.setBuddy(nameLineEdit) #輸入密碼 passwordLabel = QLabel('&Password', self) passwordLineEdit = QLineEdit(self) # 設(shè)置伙伴控件 passwordLabel.setBuddy(passwordLineEdit) #創(chuàng)建按鈕 btnOK = QPushButton("&OK") btnCancel = QPushButton("&Cancel") #柵格布局 mainLayout = QGridLayout(self) mainLayout.addWidget(nameLabel,0,0) #(0,0)表示放在一行一列 mainLayout.addWidget(nameLineEdit,0,1,1,2)#(0,1,1,2)表示放在第一行的第二列,占1行兩列 mainLayout.addWidget(passwordLabel,1,0) #(1,0)表示第二行第一列 mainLayout.addWidget(passwordLineEdit,1,1,1,2) #(1,1,1,2)表示在第二行的第二列,占一行兩列 mainLayout.addWidget(btnOK,2,1) mainLayout.addWidget(btnCancel,2,2) if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = QLabelBuddy() main.show() sys.exit(app.exec_()) #ALT+N,ALT+P 效果:alt+p,alt+n上下跳轉(zhuǎn) 二十二.限制QLineEdit控件的輸入 限制QLineEdit控件的輸入(校驗(yàn)器) 如限制只能輸入整數(shù),浮點(diǎn)數(shù)或滿足一定條件的字符串 ''' 限制QLineEdit控件的輸入(校驗(yàn)器) 如現(xiàn)在只能輸入整數(shù),浮點(diǎn)數(shù)或滿足一定條件的字符串 ''' from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import * from PyQt5.QtGui import QIntValidator,QDoubleValidator,QRegExpValidator from PyQt5.QtCore import QRegExp import sys class QLineEditValidator(QWidget): def __init__(self): super(QLineEditValidator,self).__init__() self.setWindowTitle("校驗(yàn)器") self.initUI() def initUI(self): #創(chuàng)建表單布局 formLayout = QFormLayout() intLineEdit = QLineEdit() doubleLineEdit = QLineEdit() validatorLineEdit = QLineEdit() formLayout.addRow("整數(shù)類型",intLineEdit) formLayout.addRow("浮點(diǎn)類型",doubleLineEdit) formLayout.addRow("數(shù)字和字母",validatorLineEdit) intLineEdit.setPlaceholderText("整型") doubleLineEdit.setPlaceholderText("浮點(diǎn)型") validatorLineEdit.setPlaceholderText("數(shù)字和字母") #整型校驗(yàn)器[1,99] intValidator = QIntValidator(self) intValidator.setRange(1,99) #浮點(diǎn)校驗(yàn)器[-360,360],精度:小數(shù)點(diǎn)后兩位 doubleValidator = QDoubleValidator(self) doubleValidator.setRange(-360,360) doubleValidator.setNotation(QDoubleValidator.StandardNotation) #設(shè)置精度,小數(shù)點(diǎn)2位 doubleValidator.setDecimals(2) #字符和數(shù)字 ,正則 reg = QRegExp('[a-zA-Z0-9]+$') validator = QRegExpValidator(self) validator.setRegExp(reg) #設(shè)置校驗(yàn)器 intLineEdit.setValidator(intValidator) doubleLineEdit.setValidator(doubleValidator) validatorLineEdit.setValidator(validator) self.setLayout(formLayout) if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = QLineEditValidator() main.show() sys.exit(app.exec_()) 二十三.QLineEdit綜合案例 ''' QLineEdit綜合案例 ''' from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import Qt import sys class QLineEditDemo(QWidget): def __init__(self): super(QLineEditDemo, self).__init__() self.initUI() def initUI(self): edit1 = QLineEdit() #使用int校驗(yàn)器 edit1.setValidator(QIntValidator()) edit1.setMaxLength(4) #不超過9999 edit1.setAlignment(Qt.AlignCenter) edit1.setFont(QFont("Arial",20)) #浮點(diǎn)數(shù)的校驗(yàn)器 edit2 = QLineEdit() edit2.setValidator(QDoubleValidator(0.99,99.99,2)) #掩碼 edit3 = QLineEdit() edit3.setInputMask('99_9999_999999;#') #綁定信號(hào)和槽(文本變化時(shí),觸發(fā)事件) edit4 = QLineEdit() edit4.textChanged.connect(self.textChanged) edit5 = QLineEdit() edit5.setEchoMode(QLineEdit.Password) edit5.editingFinished.connect(self.enterPress) #設(shè)置為只讀 edit6 = QLineEdit("Hello PyQt5") edit6.setReadOnly(True) formLayout = QFormLayout() formLayout.addRow("整數(shù)校驗(yàn)",edit1) formLayout.addRow("浮點(diǎn)數(shù)校驗(yàn)", edit2) formLayout.addRow("Input Mask", edit3) formLayout.addRow("文本變化", edit4) formLayout.addRow("密碼", edit5) formLayout.addRow("只讀", edit6) self.setLayout(formLayout) self.setWindowTitle("QLineEdit綜合案例") def textChanged(self,text): print('輸入的內(nèi)容:'+ text) def enterPress(self): print("已輸入值") if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = QLineEditDemo() main.show() sys.exit(app.exec_()) 效果: 二十四.QTextEdit控制輸入多行文本 ''' QTextEdit控件 ''' from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import * from PyQt5.QtGui import QIntValidator,QDoubleValidator,QRegExpValidator from PyQt5.QtCore import QRegExp import sys class QTextEditDemo(QWidget): def __init__(self): super(QTextEditDemo,self).__init__() self.initUI() def initUI(self): self.setWindowTitle("QTextEdit控件演示") self.resize(300,320) self.textEdit = QTextEdit() self.buttonText = QPushButton("顯示文本") self.buttonHTML = QPushButton("顯示HTML") self.buttonToText = QPushButton("獲取文本") self.buttonToHTML = QPushButton("獲取HTML") layout = QVBoxLayout() layout.addWidget(self.textEdit) layout.addWidget(self.buttonText) layout.addWidget(self.buttonHTML) layout.addWidget(self.buttonToText) layout.addWidget(self.buttonToHTML) self.setLayout(layout) self.buttonToText.clicked.connect(self.onClick_ButtonToText) self.buttonToHTML.clicked.connect(self.onClick_ButtonToHTML) self.buttonText.clicked.connect(self.onClick_ButtonText) self.buttonHTML.clicked.connect(self.onClick_ButtonHTML) def onClick_ButtonText(self): self.textEdit.setPlainText("Hello World") def onClick_ButtonHTML(self): self.textEdit.setHtml('<font color= "blue" size ="5">Hello World?。?! How are you?</font>') def onClick_ButtonToText(self): print(self.textEdit.toPlainText()) def onClick_ButtonToHTML(self): print(self.textEdit.toHtml()) if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = QTextEditDemo() main.show() sys.exit(app.exec_()) 二十五. 按鈕控件 ctrl+鼠標(biāo)左鍵選中——》查看該方法的源碼 ''' 按鈕控件(QPushButton) QAstractButton QPushButton AToolButton QRadioButton QCheckBox ''' import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class QPushButtonDemo(QDialog):#對(duì)話框 def __init__(self): super(QPushButtonDemo,self).__init__() self.initUI() def initUI(self): self.setWindowTitle("QPushButton Demo") #垂直布局 layout = QVBoxLayout() self.button1 = QPushButton("第一個(gè)按鈕") self.button1.setText("First Button1") self.button1.setCheckable(True) self.button1.toggle()#設(shè)置開關(guān),第一次選中 #讓你傳兩個(gè)參數(shù),lambda表達(dá)式,硬編碼(直接調(diào)用whichButton方法) self.button1.clicked.connect(lambda:self.whichButton(self.button1)) self.button1.clicked.connect(self.buttonState) layout.addWidget(self.button1) #在文本前面顯示圖像 self.button2 = QPushButton("圖像按鈕") self.button2.setIcon(QIcon(QPixmap("./images/7.jpg"))) self.button2.clicked.connect(lambda :self.whichButton(self.button2)) layout.addWidget(self.button2) #設(shè)置按鈕不可用 self.button3 = QPushButton("不可用的按鈕") self.button3.setEnabled(False) layout.addWidget(self.button3) self.button4 = QPushButton('&MyButton') self.button4.setDefault(True) self.button4.clicked.connect(lambda :self.whichButton(self.button4)) layout.addWidget(self.button4) self.setLayout(layout) self.resize(400,300) def whichButton(self,btn): print('被單擊的按鈕是<' + btn.text()+ '>') def buttonState(self): if self.button1.isCheckable(): print("按鈕1已經(jīng)被選中") else: print("按鈕1未被選中") if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = QPushButtonDemo() main.show() sys.exit(app.exec_()) 二十六.使用QDialog顯示通用對(duì)話框 ''' 使用 QDialog顯示通用對(duì)話框 基類 QDialog,在此基礎(chǔ)上有擴(kuò)展了4個(gè) QMessageBox 消息對(duì)話框 QColorDialog 顏色對(duì)話框 QFontDialog 字體對(duì)話框 QInputDialog 獲取用戶輸入信息的對(duì)話框 窗口 QMainWindow QWidget QDialog 沒有菜單 ''' #主窗口中點(diǎn)擊按鈕顯示對(duì)話框 import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class QDialogDemo(QMainWindow): def __init__(self): super(QDialogDemo,self).__init__() self.initUI() def initUI(self): self.setWindowTitle("QDialog案例") self.resize(300,200) #常見button self.button = QPushButton(self) self.button.setText("彈出對(duì)話框") self.button.move(50,50) self.button.clicked.connect(self.showDialog) def showDialog(self): dialog = QDialog() button = QPushButton("確定",dialog) button.clicked.connect(dialog.close) button.move(50,50) dialog.setWindowTitle("對(duì)話框") dialog.setWindowModality(Qt.ApplicationModal) #設(shè)置模式 dialog.exec() #顯示對(duì)話框 if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = QDialogDemo() main.show() sys.exit(app.exec_()) 效果: 二十七.顯示不同類型的消息對(duì)話框 ''' 顯示不同類型的消息對(duì)話框 消息對(duì)話框:QMessageBox 1.關(guān)于對(duì)話框 2.錯(cuò)誤對(duì)話框 3,警告對(duì)話框 4.提問對(duì)話框 5.消息對(duì)話框 有兩點(diǎn)差異 1.顯示的對(duì)話框圖標(biāo)可能不同 2.顯示的按鈕是不一樣的 ''' import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class QMessageBoxDemo(QWidget): def __init__(self): super(QMessageBoxDemo,self).__init__() self.initUI() def initUI(self): self.setWindowTitle("QMessageBox 案例") self.resize(300,400) #垂直布局 layout = QVBoxLayout() self.button1 = QPushButton() self.button1.setText("顯示對(duì)話框") self.button1.clicked.connect(self.showDialog) layout = QVBoxLayout() #關(guān)于對(duì)話框 self.button1 = QPushButton() self.button1.setText("顯示關(guān)于對(duì)話框") self.button1.clicked.connect(self.showDialog) #顯示消息對(duì)話框 self.button2 = QPushButton() self.button2.setText("顯示消息對(duì)話框") self.button2.clicked.connect(self.showDialog) #所有都綁定到一個(gè)槽上 #顯示警告對(duì)話框 self.button3 = QPushButton() self.button3.setText("顯示警告對(duì)話框") self.button3.clicked.connect(self.showDialog) #顯示錯(cuò)誤對(duì)話框 self.button4 = QPushButton() self.button4.setText("顯示錯(cuò)誤對(duì)話框") self.button4.clicked.connect(self.showDialog) # 所有都 #顯示提問對(duì)話框 self.button5 = QPushButton() self.button5.setText("顯示提問對(duì)話框") self.button5.clicked.connect(self.showDialog) # 所有都 layout.addWidget(self.button1) layout.addWidget(self.button2) layout.addWidget(self.button3) layout.addWidget(self.button4) layout.addWidget(self.button5) self.setLayout(layout) def showDialog(self): text = self.sender().text() if text == "顯示關(guān)于對(duì)話框": QMessageBox.about(self,"關(guān)于","這是一個(gè)關(guān)于對(duì)話框") elif text =="顯示消息對(duì)話框": reply = QMessageBox.information(self,"消息","這是一個(gè)消息對(duì)話框",QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes) print(reply == QMessageBox.Yes) elif text =="顯示警告對(duì)話框": QMessageBox.warning(self,"警告","這是一個(gè)警告對(duì)話框",QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes) elif text == "顯示錯(cuò)誤對(duì)話框": QMessageBox.critical(self, "錯(cuò)誤", "這是一個(gè)錯(cuò)誤對(duì)話框", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) elif text =="顯示提問對(duì)話框": QMessageBox.question(self,"提問","這是一個(gè)提問對(duì)話框",QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes) if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = QMessageBoxDemo() main.show() sys.exit(app.exec_()) 二十八.顯示不同類型的消息對(duì)話框 ''' 輸入對(duì)話框 :QInputDialog QInputDialog.getItem用來顯示輸入列表 QInputDialog.getText QInputDialog.getInt 與計(jì)數(shù)器控件有關(guān) ''' import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class QInputDialogDemo(QWidget): def __init__(self): super(QInputDialogDemo,self).__init__() self.initUI() def initUI(self): self.setWindowTitle("輸入對(duì)話框") #創(chuàng)建表單布局 layout = QFormLayout() self.button1 = QPushButton("獲取列表中的選項(xiàng)") self.button1.clicked.connect(self.getItem) self.lineEdit1 = QLineEdit() layout.addRow(self.button1,self.lineEdit1) self.button2 = QPushButton("獲取字符串") self.button2.clicked.connect(self.getText) self.lineEdit2 = QLineEdit() layout.addRow(self.button2, self.lineEdit2) self.button3 = QPushButton("獲取整數(shù)") self.button3.clicked.connect(self.getInt) self.lineEdit3 = QLineEdit() layout.addRow(self.button3, self.lineEdit3) self.setLayout(layout) def getItem(self): items = ("C","C++","Python","Java","Rudy") item,ok = QInputDialog.getItem(self,"請(qǐng)選擇編程語言","語言列表",items) if ok and item: self.lineEdit1.setText(item) def getText(self): text, ok = QInputDialog.getText(self, "文本輸入框", "輸入姓名") if ok and text: self.lineEdit2.setText(text) def getInt(self): num,ok = QInputDialog.getInt(self,"整數(shù)輸入框","輸入數(shù)字") if ok and num: self.lineEdit3.setText(str(num)) if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = QInputDialogDemo() main.show() sys.exit(app.exec_()) 效果: 二十九.文件對(duì)話框 ''' 文件對(duì)話框:QFileDialog ''' import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class QFileDialogDemo(QWidget): def __init__(self): super(QFileDialogDemo,self).__init__() self.initUI() def initUI(self): #垂直布局 layout = QVBoxLayout() self.button1 = QPushButton("加載圖片") self.button1.clicked.connect(self.loadImage) layout.addWidget(self.button1) self.imageLabel = QLabel() layout.addWidget(self.imageLabel) self.button2 = QPushButton("加載文本文件") self.button2.clicked.connect(self.loadText) layout.addWidget(self.button2) self.contents = QTextEdit() layout.addWidget(self.contents) self.setLayout(layout) self.setWindowTitle("文件對(duì)話框演示") def loadImage(self): # 選擇單個(gè)文件 fname, _ = QFileDialog.getOpenFileName(self, "打開文件", ".", "圖像文件(*.jpg *.png)") self.imageLabel.setPixmap(QPixmap(fname)) def loadText(self): dialog = QFileDialog() dialog.setFileMode(QFileDialog.AnyFile) dialog.setFilter(QDir.Files) if dialog.exec(): filenames = dialog.selectedFiles() f= open(filenames[0],encoding='utf-8',mode="r") with f: data = f.read() self.contents.setText(data) if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = QFileDialogDemo() main.show() sys.exit(app.exec_()) 效果: 三十.選項(xiàng)卡控件 ''' 選項(xiàng)卡控件:QTabWidget ''' import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class TabWidgetDemo(QTabWidget): def __init__(self,parent=None): super(TabWidgetDemo,self).__init__(parent) self.setWindowTitle("選項(xiàng)卡控件:QTabWidget") #創(chuàng)建用于顯示控件的窗口 self.tab1 = QWidget() self.tab2 = QWidget() self.tab3 = QWidget() self.addTab(self.tab1,"選項(xiàng)卡1") self.addTab(self.tab2, "選項(xiàng)卡2") self.addTab(self.tab3, "選項(xiàng)卡3") self.tab1UI() self.tab2UI() self.tab3UI() def tab1UI(self): #表單布局 layout = QFormLayout() layout.addRow("姓名",QLineEdit()) layout.addRow("地址", QLineEdit()) self.setTabText(0,"聯(lián)系方式") self.tab1.setLayout(layout) def tab2UI(self): #水平布局 layout = QFormLayout() sex = QHBoxLayout() sex.addWidget(QRadioButton("男")) sex.addWidget(QRadioButton("女")) layout.addRow(QLabel("性別"),sex) layout.addRow("生日",QLineEdit()) self.setTabText(1,"個(gè)人詳細(xì)信息") self.tab2.setLayout(layout) def tab3UI(self): #水平布局 layout = QHBoxLayout() layout.addWidget(QLabel("科目")) layout.addWidget(QCheckBox("物理")) layout.addWidget(QCheckBox("高數(shù)")) self.setTabText(2, "教育程度") self.tab3.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = TabWidgetDemo() main.show() sys.exit(app.exec_()) 效果: 三十一.堆棧窗口控件 ''' 堆棧窗口控件(QStackeWidget) ''' import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class QStackeWidgetDemo(QWidget): def __init__(self): super(QStackeWidgetDemo,self).__init__() self.setGeometry(300,50,10,10) self.setWindowTitle("堆棧窗口控件:QStackeWidget") self.list = QListWidget() self.list.insertItem(0,"聯(lián)系方式") self.list.insertItem(1, "個(gè)人信息") self.list.insertItem(2, "教育程度") #三個(gè)頁面 self.stack1 = QWidget() #對(duì)于一個(gè)頁面的窗口 self.stack2 = QWidget() self.stack3 = QWidget() self.tab1UI() #通過這三個(gè)方法,給每一頁添加控件 self.tab2UI() self.tab3UI() self.stack = QStackedWidget() self.stack.addWidget(self.stack1) #添加至堆棧中 self.stack.addWidget(self.stack2) self.stack.addWidget(self.stack3) hbox = QHBoxLayout() hbox.addWidget(self.list) hbox.addWidget(self.stack) self.setLayout(hbox) self.list.currentRowChanged.connect(self.display) #通過這個(gè)函數(shù)來切換索引 def display(self,index): self.stack.setCurrentIndex(index) def tab1UI(self): #表單布局 layout = QFormLayout() layout.addRow("姓名",QLineEdit()) layout.addRow("地址", QLineEdit()) self.stack1.setLayout(layout) def tab2UI(self): #水平布局 layout = QFormLayout() sex = QHBoxLayout() sex.addWidget(QRadioButton("男")) sex.addWidget(QRadioButton("女")) layout.addRow(QLabel("性別"),sex) layout.addRow("生日",QLineEdit()) self.stack2.setLayout(layout) def tab3UI(self): #水平布局 layout = QHBoxLayout() layout.addWidget(QLabel("科目")) layout.addWidget(QCheckBox("物理")) layout.addWidget(QCheckBox("高數(shù)")) self.stack3.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = QStackeWidgetDemo() main.show() sys.exit(app.exec_()) 效果: 三十二.??靠丶?/p> ''' 停靠部件QDockWidget ''' import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class DockDemo(QMainWindow): def __init__(self,parent=None): super(DockDemo,self).__init__(parent) self.setWindowTitle("??靠丶篞DockWidget") layout = QHBoxLayout() self.items = QDockWidget("Dockable",self) self.listWidget = QListWidget() self.listWidget.addItem("item1") self.listWidget.addItem("item2") self.listWidget.addItem("item3") self.items.setWidget(self.listWidget) self.setCentralWidget(QLineEdit()) self.items.setFloating(True) self.addDockWidget(Qt.RightDockWidgetArea,self.items) if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = DockDemo() main.show() sys.exit(app.exec_()) 效果: 三十三.容納多文檔的窗口 ''' 容納多文檔的窗口 容納多文檔的 QMdiArea 多文檔子窗口類 QMdiSubWindow 將QMdiSubWindow添加至QMdiArea中 ''' import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class MultiDemo(QMainWindow): count = 0 def __init__(self,parent=None): super(MultiDemo,self).__init__(parent) self.setWindowTitle("容納多文檔的窗口") #層疊,平鋪 self.mdi = QMdiArea() self.setCentralWidget(self.mdi) bar = self.menuBar() file = bar.addMenu("File") file.addAction("New") #新創(chuàng)建窗口 file.addAction("cascade") #顯示方式,層疊 file.addAction("Tiled")#顯示方式,平鋪 file.triggered.connect(self.windowaction) def windowaction(self,q): print(q.text()) if q.text() == "New": MultiDemo.count = MultiDemo.count +1 sub = QMdiSubWindow() sub.setWidget(QTextEdit()) sub.setWindowTitle("子窗口"+str(MultiDemo.count)) self.mdi.addSubWindow(sub) sub.show() elif q.text() =="cascade": self.mdi.cascadeSubWindows() elif q.text() =="Tiled": self.mdi.tileSubWindows() if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./images/t10.ico')) main = MultiDemo() main.show() sys.exit(app.exec_()) 效果: ———————————————— 版權(quán)聲明:本文為CSDN博主「kww_」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/qq_40243295/article/details/105633221 |
|