PyQt5系列教程(25): 工具箱(QToolBox)
上期我們還是介紹了PyQt中的按鈕(QAbstractButton),這期我們不介紹按鈕了,介紹一個類似工具箱的小部件(QToolBox)。
總體介紹
QToolBox類提供了一列選項卡的小部件(選項卡內含項目)。
工具箱是一個小部件,它將選項卡一個一個的顯示,當前項目顯示在當前選項卡下方。每個選項卡在選項卡列中都有一個索引位置。一個選項卡的項目是一個QWidget。
每個項目都有一個itemText(),一個可選的itemIcon(),一個可選的itemToolTip()和一個widget()。項目的屬性可以通過setItemText(),setItemIcon()和setItemToolTip()來改變。每個項目都可以使用setItemEnabled()單獨啟用或禁用。
項目使用addItem()添加,或使用insertItem()插入特定位置。項目總數由count()給出。可以刪除項目,或使用removeItem()從工具箱中刪除項目。通過組合removeItem()和insertItem(),您可以將項目移動到不同的位置。
當前項目小部件的索引由currentIndex()返回,並用setCurrentIndex()設置。可以使用indexOf()來找到特定項目的索引,並且item()返回給定索引處的項目。
currentChanged()信號在當前項目改變時發出。
更多詳細的介紹,請見官網:QToolBox Class | Qt Widgets 5.10
類的歸屬
PyQt5->QtWidgets->QToolBox
繼承:QFrame
小例子
我們先通過一個視頻來看一下今天的完成效果:
https://www.zhihu.com/video/942417282891333632- 核心代碼
class Example(QToolBox): def initUI(self): self.resize(280,500) self.setWindowTitle(微信公眾號:學點編程吧--QToolBox) self.setWindowFlags(Qt.Dialog) favorites =[ [ {des:百度搜索, pic:image/se/baidu.ico}, {des:搜狗搜索, pic:image/se/sougo.ico}, {des:必應搜索, pic:image/se/bing.ico}, {des:360搜索, pic:image/se/360.ico}, {des:谷歌搜索, pic:image/se/google.ico}, {des:雅虎搜索, pic:image/se/yahoo.ico} ], [ {des:騰訊視頻, pic:image/v/tengxun.ico}, {des:搜狐視頻, pic:image/v/sohuvideo.ico}, {des:優酷視頻, pic:image/v/youku.ico}, {des:土豆視頻, pic:image/v/tudou.ico}, {des:AcFun彈幕, pic:image/v/acfun.ico}, {des:嗶哩嗶哩, pic:image/v/bilibili.ico} ] ] for item in favorites: groupbox = QGroupBox() vlayout = QVBoxLayout(groupbox) vlayout.setAlignment(Qt.AlignCenter) for category in item: toolButton = QToolButton() toolButton.setText(category[des]) toolButton.setIcon(QIcon(category[pic])) toolButton.setIconSize(QSize(64, 64)) toolButton.setAutoRaise(True) toolButton.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) vlayout.addWidget(toolButton) name = category[des] toolButton.clicked.connect(Branded Short Domain Powered by Bitly) if name == 雅虎搜索: self.addItem(groupbox,搜索引擎) else: self.addItem(groupbox,視頻網站) def run(self): if self.sender().text() == 百度搜索: webbrowser.open(https://www.baidu.com) elif self.sender().text() == 搜狗搜索: webbrowser.open(https://www.sogou.com/) #...下面的代碼和上面差不多,不再描述
在這個例子當中我們實現了以下的功能:
- 將按鈕分類搜索和視頻兩類,並分別集合到不同選項卡中。
- 點擊按鈕會打開對應的網址
- 代碼解析
favorites =[ [ {des:百度搜索, pic:image/se/baidu.ico}, {des:搜狗搜索, pic:image/se/sougo.ico}, {des:必應搜索, pic:image/se/bing.ico}, {des:360搜索, pic:image/se/360.ico}, {des:谷歌搜索, pic:image/se/google.ico}, {des:雅虎搜索, pic:image/se/yahoo.ico} ], [ {des:騰訊視頻, pic:image/v/tengxun.ico}, {des:搜狐視頻, pic:image/v/sohuvideo.ico}, {des:優酷視頻, pic:image/v/youku.ico}, {des:土豆視頻, pic:image/v/tudou.ico}, {des:AcFun彈幕, pic:image/v/acfun.ico}, {des:嗶哩嗶哩, pic:image/v/bilibili.ico} ] ]
因為在程序中我們涉及到了12個按鈕,每個按鈕顯示的圖標和名稱是不一樣的,如果我建立12個按鈕對象,再分別設置太麻煩了。so,我將不同的部分抽取出來,每一個按鈕對應一個字典,而每一類按鈕又組合成一個列表,最後將兩個不同的列表組合成一個大的列表。
for item in favorites:
將favorites列表中的item進行遍歷,每個item代表一個眾多按鈕的集合,也就是QToolBox的選項卡。
groupbox = QGroupBox()vlayout = QVBoxLayout(groupbox)vlayout.setAlignment(Qt.AlignCenter)
我們新建一個組合框,並對其進行垂直布局,布局方式為居中。
QGroupBox小部件提供了一個帶有標題的組合框。一個組合框提供了一個框架,頂部的標題,一個鍵盤快捷鍵,並顯示其內部的各種其他小部件(這點就是我們用到的)。
Qt.AlignCenter是一種對齊方式,我們在
學點編程吧:PyQt5系列教程(21):標籤(QLabel)
中介紹過,這裡就不在詳解了。
for category in item: toolButton = QToolButton() toolButton.setText(category[des]) toolButton.setIcon(QIcon(category[pic])) toolButton.setIconSize(QSize(64, 64)) toolButton.setAutoRaise(True) toolButton.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) vlayout.addWidget(toolButton)
這裡我們對每個按鈕集合中項目進行遍歷。新建QToolBox對象,並設置其相應的屬性:顯示的名稱(是「優酷」還是「嗶哩嗶哩」)、圖標及大小、按鈕是否自動浮起、讓按鈕顯示的名稱在按鈕下方,同時將這個按鈕增加到垂直布局當中。
更多關於QToolButton的介紹,請參見
學點編程吧:PyQt5系列教程(23):工具按鈕(QToolButton) name = category[des] if name == 雅虎搜索: self.addItem(groupbox,搜索引擎) else: self.addItem(groupbox,視頻網站)
當我們遍歷完一個按鈕集合的時候,此時我們判斷最後一個按鈕顯示的文字是「搜索引擎」還是「視頻網站」,並將這一系列的按鈕增加到一個選項卡中。
toolButton.clicked.connect(self.run)def run(self): if self.sender().text() == 百度搜索: webbrowser.open(https://www.baidu.com) elif self.sender().text() == 搜狗搜索: webbrowser.open(https://www.sogou.com/) #...下面的代碼和上面差不多,不在描述
這個就是一個常規的信號與槽函數的調用,當我們點擊按鈕的時候會打開相應的網站。
最後
ok,今天的介紹暫時就到這裡吧,下期我們再見。如果你喜歡本篇文章,請給我
點贊
讚賞
分享給你的好友們吧!
如果你想要本次教程中的相關源碼,請關注微信公眾號:學點編程吧,發送:pyqt525,會自動得到相應的百度網盤下載鏈接。
推薦閱讀:
※0x02:入門(2)
※Python實現手繪功能
※Python 繪製分形圖(曼德勃羅集、分形樹葉、科赫曲線、分形龍、謝爾賓斯基三角等)附代碼
※用例3: CVE-2012-3152
※Python從零開始系列連載(19)——Python特色數據類型(列表)(下)