iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
Software Development

[Python QT] 玩玩 Pyside 的各種功能系列 第 19

【Day19】QToolButton 收尾 + QRadioButton

  • 分享至 

  • xImage
  •  

接續昨天想要達成的目標, 發現只要把在編輯裡的 Menu, 先變成成員函數, 然後利用 popup (QCursor.pos()) 即可, 非常簡單
先把完整程式碼 po 出來

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 = QGridLayout()
        self.setLayout(layout)
        self.edit = QLineEdit()
        self.edit.setContextMenuPolicy(Qt.CustomContextMenu)
        self.edit.customContextMenuRequested.connect(self.rightClickMenu)
        layout.addWidget(self.edit, 1, 0, 2, 3)

        self.tb = QToolButton(self)
        self.tb.setText("檔案")
        self.tb.setAutoRaise(True)
        self.tb.setStyleSheet("QToolButton::menu-indicator { image: None; }")
        self.tb.setCursor(Qt.PointingHandCursor)
        layout.addWidget(self.tb, 0, 0)
        self.editTB = QToolButton(self)
        self.editTB.setText("編輯")
        self.editTB.setAutoRaise(True)
        self.editTB.setStyleSheet("QToolButton::menu-indicator { image: None; }")
        self.editTB.setCursor(Qt.PointingHandCursor)
        layout.addWidget(self.editTB, 0, 1)
        self.setupToolButton()

    def setupToolButton(self):
        self.setupFileToolButton()
        self.setupEditToolButton()

    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)

    def setupEditToolButton(self):
        self.editMenu = QMenu("Menu", self)
        self.editMenu.setCursor(Qt.PointingHandCursor)
        undo = QAction(QIcon("icon\\undo-alt.png"), "復原", self)
        undo.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_Z))
        undo.setShortcutContext(Qt.ApplicationShortcut)
        undo.triggered.connect(self.edit.undo)
        redo = QAction(QIcon("icon\\redo-alt.png"), "取消復原", self)
        redo.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_Y))
        redo.setShortcutContext(Qt.ApplicationShortcut)
        redo.triggered.connect(self.edit.redo)
        cut = QAction(QIcon("icon\\scissors.png"), "剪下", self)
        cut.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_X))
        cut.setShortcutContext(Qt.ApplicationShortcut)
        cut.triggered.connect(self.edit.cut)
        copy = QAction(QIcon("icon\\copy.png"), "複製", self)
        copy.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_C))
        copy.setShortcutContext(Qt.ApplicationShortcut)
        copy.triggered.connect(self.edit.copy)
        paste = QAction("貼上", self)
        paste.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_V))
        paste.setShortcutContext(Qt.ApplicationShortcut)
        paste.triggered.connect(self.edit.paste)
        delete = QAction(QIcon("icon\\trash.png"), "刪除", self)
        delete.triggered.connect(self.edit.backspace)
        selectAll = QAction("全選", self)
        selectAll.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_A))
        selectAll.setShortcutContext(Qt.ApplicationShortcut)
        selectAll.triggered.connect(self.edit.selectAll)
        self.editMenu.addAction(undo)
        self.editMenu.addAction(redo)
        self.editMenu.addSeparator()
        self.editMenu.addAction(cut)
        self.editMenu.addAction(copy)
        self.editMenu.addAction(paste)
        self.editMenu.addAction(delete)
        self.editMenu.addSeparator()
        self.editMenu.addAction(selectAll)

        self.editTB.setMenu(self.editMenu)
        self.editTB.setPopupMode(QToolButton.InstantPopup)

    def rightClickMenu(self):
        self.editMenu.popup (QCursor.pos())

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

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

    sys.exit(app.exec())

最終成果
final


接下來回去 QAbstractButton 裡 QToolButton 的下一個 QRadioButton

不知道 RadioButton 是甚麼意思沒關係
我們一樣跟 QToolButton 的第一天一樣, 建一個只有顯示 RadioButton 的介面

import sys
from PySide6.QtWidgets import *

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        tb = QRadioButton(self)
        tb.setText("RadioButton")

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

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

    sys.exit(app.exec())

https://ithelp.ithome.com.tw/upload/images/20220921/20151144HVfG0t4U7D.png

看起來像跟 Google 問卷中, 單選題裡的選項很像, 白色圈圈裡可以點
在甚麼都沒有設定的情況下, 如果點了白色圈圈時會如下圖
https://ithelp.ithome.com.tw/upload/images/20220921/20151144jc5KCuBgJi.png
白色圈圈裡會多一個藍色的小圈圈, 感覺真的可以做出一個跟 Google 問卷介面類似的程式
那我們這次 RadioButton 的例子, 就以 Google 問卷裡的單選或多選問題來做程式吧


題外話, 今天發現得了板機指, 有夠哭, 可能是因為我上班用滑鼠鍵盤, 下班後還繼續用滑鼠鍵盤寫程式的原因吧, 手超級痛, 沒想到連續 18 天上下班都寫程式會對手指造成這麼大的負擔, 還兩手都痛, 只要我跟平時一樣打字跟點擊, 手指就會傳來刺痛感, 看來該換個可以輕鬆案的鍵盤跟滑鼠, 別讓自己手指太用力


上一篇
【Day18】QToolButton 續續糸賣糸賣
下一篇
【Day20】QRadioButton 選擇題
系列文
[Python QT] 玩玩 Pyside 的各種功能31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言