2013/01/06

[PySide] UIからいろいろな値を取ろう

過去2回、ガワばっかり作っておりましたが
いい加減中身作れっちゅう話で。。

ということで、オプション項目によく使う代表的なウィジェットから
値を取ってくる部分をやってみましょう



実験UI作って値を取るよ


今回はいきなり最終形で
(コピペして使えるようにUI構築部分もフルスクラッチしてある安心設計)
# -*- coding: utf-8 -*-

import os
import sys

from PySide import QtCore, QtGui

#------------------------------------------------------------------------------
## GUIを作るクラス
class GUI(QtGui.QWidget):
 
    def __init__(self, parent=None):
        super(GUI, self).__init__(parent)

        # 空の縦レイアウトを作る
        self.layout = QtGui.QVBoxLayout()
        self.setLayout(self.layout)

        # ラジオボタン
        self.radio = QtGui.QRadioButton('radioButton')
        self.layout.addWidget(self.radio)

        # チェックボックス
        self.check = QtGui.QCheckBox('checkBox')
        self.layout.addWidget(self.check)

        # ラインエディット
        self.lineEdit = QtGui.QLineEdit('lineEdit')
        self.layout.addWidget(self.lineEdit)

        # スピンボックス
        self.spin = QtGui.QSpinBox()
        self.layout.addWidget(self.spin)

        # コンボボックス
        self.combo = QtGui.QComboBox()
        self.combo.addItems(['A', 'B', 'C'])
        self.layout.addWidget(self.combo)

        # リストウィジェット
        self.listWidget = QtGui.QListWidget()
        self.listWidget.addItems(['itemA', 'itemB', 'itemC'])
        self.layout.addWidget(self.listWidget)

        # 最後にOKボタン
        self.okButton = QtGui.QPushButton('OK')
        self.layout.addWidget(self.okButton)

        # UI要素にシグナルを追加
        self.setSignals()

    #----------------------------------------
    ## UI要素にシグナルを追加
    def setSignals(self):
        self.okButton.clicked.connect(self.getValue)

    #----------------------------------------
    ## UI要素のステータスやら値やらプリントする
    def getValue(self):
        print '\n'
        print ' getValue '.center(80, '*')
        print '\n'

        print 'RadioButton State = ', self.radio.isChecked()
        print 'CheckBox State    = ', self.check.isChecked()
        print 'LineEdit Text     = ', self.lineEdit.text()
        print 'SpinBox Value     = ', self.spin.value()
        print 'ComboBox Index    = ', self.combo.currentIndex()
        print 'ComboBox Label    = ', self.combo.currentText()

        currentListIndex = self.listWidget.currentRow()
        print 'ListWidget index  = ', currentListIndex
        if currentListIndex == -1:
            print 'ListWidget Text   = None'
        else:
            print 'ListWidget Text   = ', self.listWidget.currentItem().text()

        print '\n'
        print ' getValue '.center(80, '*')

#------------------------------------------------------------------------------ 
## GUIの起動
def main():
    app = QtGui.QApplication(sys.argv)
    ui = GUI()
    ui.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

#------------------------------------------------------------------------------
# EOF
#------------------------------------------------------------------------------


実行するとこんな感じのUIが出て、適当にいじってOKボタンを押すと
いじった値がプリント文で出力されます


ラジオボタンが選択されている(True)、文字入力欄は"aaaaaaaaa"、
リストのインデックスが2(0始まり)で、itemCという項目が選ばれている等々…
*********************************** getValue ***********************************

RadioButton State =  True
CheckBox State    =  False
LineEdit Text     =  aaaaaaaaa
SpinBox Value     =  5
ComboBox Index    =  1
ComboBox Label    =  B
ListWidget index  =  2
ListWidget Text   =  itemC

*********************************** getValue ***********************************





値を取るコマンドを探し当てる


PySideに限ったことではないですが、どうやって値を取るか分からないと先に進みません
ましてやPySideは日本語文献があまり見つからないのでなかなか大変です

ということで、どうやってうまいことその取得コマンドを探し当てるかの方法です

とりあえずドキュメントページにアクセスして、調べたいウィジェットを検索してみます
Overview — PySide v1.0.7 documentation


サーチ結果から、調べたいウィジェットのリンクに飛びます


あ…れ……、何にもない…
そんなときは上のほうにあるクラス継承図みたいなやつでひとつ上にさかのぼってみましょう


お、なんかそれっぽいやつあった!


詳細をみたところ、ボタンのチェック状態をboolで返してくれそうな感じです


最初のスクリプト例で実際に使ってる部分がここです
print 'RadioButton State = ', self.radio.isChecked()


ほかにも QListWidget など、リストのインデックスが欲しい場合と、
項目の文字列が欲しい場合などいろいろなニーズに応えてくれるコマンドはたくさん用意されています


ちなみにスクリプト例で、リストウィジェットだけなんか記述が多いのは
選択がされてない状態で currentItem を取ろうとするとエラーが出るのでそれを回避しているからです
# 選択されているインデックスを取得
currentListIndex = self.listWidget.currentRow()
# 取得したインデックスをプリント
print 'ListWidget index  = ', currentListIndex

# もしインデックスが -1 であった場合、無選択状態のため分岐
if currentListIndex == -1:
    print 'ListWidget Text   = None'
else:
    print 'ListWidget Text   = ', self.listWidget.currentItem().text()




と、こんな感じでオプション項目から値が取る方法が分かれば
OKボタンを押した先の処理に繋げていけると思います

3 件のコメント:

  1. QRadioButtonの値の取り方調べてたらここにたどり着きました。
    お陰で無事取れました。ありがとう!

    返信削除
  2. 結局ここにたどりつきました、にいさんありがとう

    返信削除
  3. さすがにいさんや!ありがとう!

    返信削除