iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0

昨天雖然有成功達成下拉式選單, 但是
https://ithelp.ithome.com.tw/upload/images/20220918/20151144QwXPrrzS6d.png
檔案右下角的三角形是甚麼?!!!
即使我加了

tb.setArrowType(Qt.NoArrow)

這句一樣存在!!!
東翻西找後把上面那句用 setStyleSheet 代替就可以了~~

tb.setStyleSheet("QToolButton::menu-indicator { image: None; }")

https://ithelp.ithome.com.tw/upload/images/20220918/201511440l289vU7Tb.png
對結果非常滿意~
接下來先完成檔案選單內裡的長相, 雖然沒有真的功能, 但至少要好看, 另外, 發現 __init__ 太多行了, 決定把設置外觀的程式碼分出來變成新的 function
一樣, 這次圖標來源為 Flaticon

import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.tb = QToolButton(self)
        self.tb.setText("檔案")
        self.tb.setAutoRaise(True)
        self.tb.setStyleSheet("QToolButton::menu-indicator { image: None; }")
        self.tb.setCursor(Qt.PointingHandCursor)
        self.setupFileToolButton()

    def setupFileToolButton(self):
        menu = QMenu("Menu", self)
        menu.setCursor(Qt.PointingHandCursor)
        newMenu = QMenu("新文件", self)
        newMenu.setIcon(QIcon("icon\document.png"))
        doc = QAction(QIcon("icon\document (1).png"), "文件", self)
        useExample = QAction(QIcon("icon\edit-alt.png"), "使用範本", self)
        newMenu.addAction(doc)
        newMenu.addAction(useExample)
        open = QAction(QIcon("icon\_folder.png"), "開啟", self)
        open.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_O))
        open.setShortcutContext(Qt.ApplicationShortcut)
        makeCopy = QAction(QIcon("icon\duplicate.png"), "建立副本", self)
        rename = QAction(QIcon("icon\edit.png"), "重新命名", self)
        move = QAction(QIcon("icon\_book-arrow-right.png"), "移動", self)
        delete = QAction(QIcon("icon\\trash.png"), "移至垃圾桶", self)
        menu.addMenu(newMenu)
        menu.addAction(open)
        menu.addAction(makeCopy)
        menu.addSeparator()
        menu.addAction(rename)
        menu.addAction(move)
        menu.addAction(delete)

        self.tb.setMenu(menu)
        self.tb.setPopupMode(QToolButton.InstantPopup)

if __name__ == "__main__":
    app = QApplication([])

    widget = MyWidget()
    widget.resize(300, 300)
    widget.show()

    sys.exit(app.exec())

展示
m
喔~~~ 完美!!
在這裡發現了一件事, 就是使用圖片時, 如果發現圖片顯示不出來, 請注意圖片名稱第一個字, 有兩種方法可以解決

  1. 在圖片名最開頭加上 _
  2. 在程式裡圖片名稱前多加一個 \, 變成雙反斜線
    這樣圖片就能正常顯示

另外在這裡還使用了一個叫做 setShortcut 的功能, 簡單來說就是設置快捷鍵
但想要在 Menu 後方顯示此動作的快捷鍵的話要再加上

open.setShortcutContext(Qt.ApplicationShortcut)

這樣就會像一般應用程式一樣, 有圖示, 有功能名稱也顯示快捷鍵
但為了讓讀者看到快捷鍵有效, 決定在這裡加回加數字的小功能

import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.num = 0
        layout = QVBoxLayout(self)
        self.setLayout(layout)
        self.label = QLabel("0", alignment = Qt.AlignCenter)
        layout.addWidget(self.label)

        self.tb = QToolButton(self)
        self.tb.setText("檔案")
        self.tb.setAutoRaise(True)
        self.tb.setStyleSheet("QToolButton::menu-indicator { image: None; }")
        self.tb.setCursor(Qt.PointingHandCursor)
        self.setupFileToolButton()

    def setupFileToolButton(self):
        menu = QMenu("Menu", self)
        menu.setCursor(Qt.PointingHandCursor)
        newMenu = QMenu("新文件", self)
        newMenu.setIcon(QIcon("icon\document.png"))
        doc = QAction(QIcon("icon\document (1).png"), "文件", self)
        useExample = QAction(QIcon("icon\edit-alt.png"), "使用範本", self)
        newMenu.addAction(doc)
        newMenu.addAction(useExample)
        open = QAction(QIcon("icon\_folder.png"), "開啟", self)
        open.triggered.connect(self.addOne)
        open.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_O))
        open.setShortcutContext(Qt.ApplicationShortcut)
        makeCopy = QAction(QIcon("icon\duplicate.png"), "建立副本", self)
        rename = QAction(QIcon("icon\edit.png"), "重新命名", self)
        move = QAction(QIcon("icon\_book-arrow-right.png"), "移動", self)
        delete = QAction(QIcon("icon\\trash.png"), "移至垃圾桶", self)
        menu.addMenu(newMenu)
        menu.addAction(open)
        menu.addAction(makeCopy)
        menu.addSeparator()
        menu.addAction(rename)
        menu.addAction(move)
        menu.addAction(delete)

        self.tb.setMenu(menu)
        self.tb.setPopupMode(QToolButton.InstantPopup)

    def addOne(self):
        self.num  = self.num + 1
        self.label.setText(str(self.num))

if __name__ == "__main__":
    app = QApplication([])

    widget = MyWidget()
    widget.resize(300, 300)
    widget.show()

    sys.exit(app.exec())

HOTKEY
在我箭頭放在螢幕中央不動時, 其實我正在案 CTRL+O, 由這次展示可以看出快捷鍵有成功設置
不過, 加了 layout 後, ToolButton 的長相也變了, 不知道為甚麼, 雖然影響不大啦


上一篇
【Day15】QToolButton 續 + 15 天心得
下一篇
【Day17】QToolButton 續*3
系列文
[Python QT] 玩玩 Pyside 的各種功能31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言