#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2016/11/09 20:34:28 +0900> u""" 押したままの状態になるボタンを並べてツールパネル相当を作るテスト. アイコン画像をボタン上に表示してみる版。 """ import sys from PySide.QtCore import * # NOQA from PySide.QtGui import * # NOQA class ToolPanel(QWidget): u"""ツールパネル用Widget.""" button_clicked = Signal(int) # シグナルを用意 def __init__(self, *argv, **keywords): u"""初期化.""" super(ToolPanel, self).__init__(*argv, **keywords) # 画像を読み込んで分割 im = QImage("./toolbar_32x32x8.png") h = im.size().height() imgs = [] for i in range(8): imgs.append(im.copy(i * h, 0, h, h)) self.grp = QButtonGroup() gb = QGridLayout() gb.setHorizontalSpacing(0) # GridLayoutの水平余白を設定 gb.setVerticalSpacing(0) # GridLayoutの垂直余白を設定 dt = [ (0, 0, 0, "Brush"), (1, 0, 1, "Erase"), (2, 0, 2, "Line"), (3, 0, 3, "Box Line"), (4, 0, 4, "Box Fill"), (0, 1, 5, "Fill"), (1, 1, 6, "Text"), (2, 1, 7, "Select"), ] for x, y, id, s in dt: icon = QIcon(QPixmap.fromImage(imgs[id])) # アイコン画像を生成 btn = QPushButton(icon, "", self) # アイコンサイズを画像の元サイズにする btn.setIconSize(imgs[id].size()) btn.setToolTip(s) # ツールチップを指定 btn.setCheckable(True) # トグルボタンにする self.grp.addButton(btn, id) # グループ登録してラジオボタン風に使う gb.addWidget(btn, y, x) self.setLayout(gb) self.grp.setExclusive(True) # 排他的なボタン処理にする self.grp.button(0).setChecked(True) # 最初のボタンを押しておく self.grp.buttonClicked.connect(self.changed_button) def changed_button(self): u"""ボタンが押された時に呼ばれる処理.""" self.button_clicked.emit(self.grp.checkedId()) # シグナルを発生 def get_id(self): u"""選択状態(ID)を返す.""" return self.grp.checkedId() class MyMainWidget(QWidget): u"""メインウインドウ.""" def __init__(self, *argv, **keywords): u"""初期化.""" super(MyMainWidget, self).__init__(*argv, **keywords) self.tb = ToolPanel(self) self.tb.button_clicked.connect(self.changed_toolbox) self.lbl = QLabel("----", self) self.lbl.setText("ID=%d" % self.tb.get_id()) l = QVBoxLayout() l.addWidget(self.tb) l.addWidget(self.lbl) self.setLayout(l) def changed_toolbox(self, id): u"""ツールの選択状態が切り替わった時に呼ばれる処理.""" self.lbl.setText("ID=%d" % id) def main(): u"""メイン処理.""" app = QApplication(sys.argv) app.setStyle(QStyleFactory.create("cleanlooks")) # app.setStyle(QStyleFactory.create("plastique")) # app.setStyle(QStyleFactory.create("windows")) # app.setStyle(QStyleFactory.create("windowsvista")) w = MyMainWidget() w.show() sys.exit(app.exec_()) if __name__ == '__main__': main()