見出し画像

PySideのボタン

今回はPySideのボタン類を使ってみる

その前に、コードの整理として、uiファイルを読み込む部分と、
uiを構築する部分を、それぞれ別関数にする

    def locdUI(self):
        # Load ui file
        loader = QUiLoader()
        ui_file_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), '.\\ui\\ui_HelloWindow.ui')
        ui_file = QFile(ui_file_path)
        ui_file.open(QFile.ReadOnly)
        self.ui = loader.load(ui_file, self)
        ui_file.close()
    def initUI(self):
        # Set Window Title
        title = self.ui.windowTitle()
        self.setWindowTitle(title)
        # Set Window Size
        w = self.ui.size().width()
        h = self.ui.size().height()
        self.resize(w, h)

        # Set Menu Bar
        teapotAction = self.ui.findChild(QAction, 'actionTeaPot')
        teapotAction.triggered.connect(self.makeTeapot)
        createMenu = self.ui.findChild(QMenu, 'menuCreate')
        createMenu.addAction(teapotAction)
        menu = self.ui.findChild(QMenuBar, 'menubar')
        menu.addMenu(createMenu)
        self.setMenuBar(menu)

        # Set Status Bar
        # Instance Variable
        self.statusbar = self.ui.findChild(QStatusBar, 'statusbar')
        self.setStatusBar(self.statusba)

# 以下略

まず、以下の様にQt Designerでボタンを配置する
ボタン類は左のBottunsのみ使用する

ボタン配置
Window

PushButton

        # PushButton
        p_btn = self.ui.findChild(QPushButton, 'pushButton')
        p_btn.clicked.connect(self.makeTeapot)

    def makeTeapot(self):
        with pymxs.undo(True, 'Create TeaPot'):
            rt.teapot()
            rt.redrawViews()

ToolButton

        # ToolButton
        t_btn = self.ui.findChild(QToolButton, 'toolButton')
        icon_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), '.\\icons\\teapot.png')
        icon = QIcon()
        icon.addPixmap(QPixmap(icon_path), QIcon.Normal, QIcon.Off)
        t_btn.setIcon(icon)
        t_btn.clicked.connect(self.clickedTool)

    def clickedTool(self):
        # Open File Dialog
        file_dialog = QFileDialog()
        open_file = file_dialog.getOpenFileName(self)

ToolButtonでList形式のボタンを作成できる
Qt DesignerToolButtoncheckableONにする

checkableをON
        # Button List
        tl_btn = self.ui.findChild(QToolButton, 'toolButton_2')
        btn_menu_list = QMenu(tl_btn)
        # Action
        ts_act = QAction("Hoge", self)
        ts_act.setCheckable(True)
        btn_menu_list.addAction(ts_act)
        hoge_act = QAction("Piyo", self)
        hoge_act.setCheckable(True)
        btn_menu_list.addAction(hoge_act)
        tl_btn.setMenu(btn_menu_list)
        # Action Group
        group_action = QActionGroup(self)
        group_action.addAction(ts_act)
        group_action.addAction(hoge_act)
        group_action.triggered.connect(self.selectMenu)

    def selectMenu(self):
        group: QActionGroup = self.sender()
        action = group.checkedAction()
        # Get button
        tl_btn = self.findChild(QToolButton, 'toolButton_2')
        # Set Action text to Button text
        tl_btn.setText(action.text())
        menu = tl_btn.menu()
        menu.setActiveAction(action)

ToolButtonにはメニューが追加できるので、QMenuQAction,QActionGroupを作成して、ToolButtonに登録する。
これで、メニューみたいなボタンが作成できる。

ToolButtonのMenu

RadioButton

        # Create ButtonGroup
        self.radioGroup = QButtonGroup()
        # RadioButton
        ra_btn = self.ui.findChild(QRadioButton, 'radioButton')
        rb_btn = self.ui.findChild(QRadioButton, 'radioButton_2')
        # Add RadioButton to ButtonGroup
        self.radioGroup.addButton(ra_btn)
        self.radioGroup.addButton(rb_btn)
        self.radioGroup.buttonClicked.connect(self.clickedRadio)

    def clickedRadio(self):
        # Get checked button
        sel_btn = self.radioGroup.checkedButton()
        self.showMessage(sel_btn.text())

CheckBox

        # CheckBox
        c_box = self.ui.findChild(QCheckBox, 'checkBox')
        c_box.stateChanged.connect(self.checkedBox)

    def checkedBox(self):
        c_box = self.findChild(QCheckBox, 'checkBox')
        if c_box.checkState() == Qt.Checked:
            self.showMessage("Check Box ON")
        else:
            self.showMessage("Check Box OFF")

CommandLinkButton

        # CommandLinkButton
        cl_btn = self.ui.findChild(QCommandLinkButton, 'commandLinkButton')
        cl_btn.clicked.connect(self.clickLink)

    def clickLink(self):
        cl_btn = self.findChild(QCommandLinkButton, 'commandLinkButton')
        if cl_btn.isChecked() == True:
            self.showMessage("Linked Button Checked")
        else:
            self.showMessage("Linked Button Unchecked")

DialogButtonBox

Buttonの設定
        # DialogButtonBox
        db_box = self.ui.findChild(QDialogButtonBox, 'buttonBox')
        db_box.clicked.connect(self.clickButtonBox)

    def clickButtonBox(self, btn):
        db_btn = self.findChild(QDialogButtonBox, 'buttonBox')
        status = db_btn.standardButton(btn)
        if status == QDialogButtonBox.StandardButton.Ok:
            self.showMessage("Button Box OK")
        elif status == QDialogButtonBox.StandardButton.Cancel:
            self.showMessage("Button Box Cancel")

まだ、基本的な使い方だけで、どう使うかはまだよく分からない
とりあえずは、PushButton, RadioButton, CheckBoxぐらいでいいかと思う

今後、何か分かったら更新していく

この記事が気に入ったらサポートをしてみませんか?