mieki256's diary



2016/11/24(木) [n年前の日記]

#1 [python] PySideでアコーディオンっぽいソレを実験

アコーディオンっぽいウィジェットを実現してみたい。クリックすると中身が開いたり閉じたりするアレ。

あのUI、名前が分からんのだけど。とりあえず以下のページでもアコーディオンって言ってるし、それでいいのかな…。どうなんだろ…。

_モバイルデバイスにおけるアコーディオンUI - U-Site

こんな感じだろうか…。アニメーションは無いけれど。

_hide_widget_test.py
u"""
Widgetの表示・非表示ができるかどうかのテスト.

動作確認環境 : Windows10 x64 + Python 2.7.12 + PySide 1.2.4
"""

import sys
from PySide.QtCore import *  # NOQA
from PySide.QtGui import *   # NOQA


class AccordionWidget(QWidget):

    u"""アコーディオンモドキのカスタムウィジェット."""

    layout_changed = Signal()

    def __init__(self, title, parent=None):
        """init."""
        super(AccordionWidget, self).__init__(parent)
        self.title = title
        self.open_flag = True

        self.open_btn = QPushButton("", self)
        self.open_btn.setStyleSheet("text-align: left;")
        self.update_button_text()

        self.mainw = QLabel(self)
        self.mainw.setPixmap("./tmp_bg.png")

        l = QVBoxLayout(self)
        l.addWidget(self.open_btn)
        l.addWidget(self.mainw)
        self.setLayout(l)

        self.open_btn.clicked.connect(self.open_close_main_widget)

    def open_close_main_widget(self):
        u"""メインウィジェットを開いたり閉じたりする処理."""
        if self.open_flag:
            self.mainw.hide()
            self.open_flag = False
        else:
            self.mainw.show()
            self.open_flag = True
        self.update_button_text()
        # self.layout().update()
        self.updateGeometry()
        # self.update()
        self.layout_changed.emit()

    def update_button_text(self):
        u"""開閉ボタンのテキストを設定."""
        if self.open_flag:
            self.open_btn.setText(self.title)
        else:
            self.open_btn.setText(u"> " + self.title)


class TestQTabWidget(QWidget):

    u"""メインウインドウ相当."""

    def __init__(self, *argv, **keywords):
        """init."""
        super(TestQTabWidget, self).__init__(*argv, **keywords)

        page1 = AccordionWidget("page 1", self)
        page2 = AccordionWidget("page 2", self)
        page3 = AccordionWidget("page 3", self)

        l = QVBoxLayout()
        l.addWidget(page1)
        l.addWidget(page2)
        l.addWidget(page3)
        self.setLayout(l)

        page1.layout_changed.connect(self.changed_layout)
        page2.layout_changed.connect(self.changed_layout)
        page3.layout_changed.connect(self.changed_layout)

    def changed_layout(self):
        u"""レイアウトが変更された時に呼ばれる処理."""
        # レイアウトを再計算させるときは以下のように書くらしい
        self.layout().activate()
        self.resize(self.sizeHint())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = TestQTabWidget()
    w.show()
    sys.exit(app.exec_())

hide_widget_test_ss01.gif


QWidget を非表示にするのは、hide()。表示するのは show() でいいらしい。ちなみに最初は show() の代わりに setVisible(True) を呼んでたけど、そっちでも表示できた。

ウィジェットを表示した時はウインドウが大きくなってくれるけど、隠した時は小さくなってくれなくて悩んだり。レイアウトの再計算が必要なのだろうけど。

レイアウトを再計算してウインドウをリサイズする方法は、 _PySide and Python Tips - The Art & Tech of Christian Akesson で紹介されてた。
layout.activate()
self.resize(self.sizeHint())
これで、現状に合わせてサイズ変更されるようになった。

ボタン内のテキストを左詰めで表示したい時は、スタイルシートで指定するようで。
self.open_btn.setStyleSheet("text-align: left;")
こんな感じでいいらしい。

ボタンに記号を表示したいのだけど。 :

中身を開いてる時と閉じてる時で、ボタン上に異なる記号を表示したいのだけど、何を表示すればしっくりくるのか悩んでしまったり。

右向き・下向きの三角を表示したほうが分かりやすいのだろうか…。でも、その手の記号を含んでいて、どのOSでも使えるフォントってあるのかな。無さそうな気もするけど。

あるいは、「[+}」「[-]」みたいなソレのほうが…。いや、ソレはちょっと見た目がダサいかな…。

フツーは何を表示するんだろう。そういえば、Webページ上のソレは、記号の類は何も表示してない場合が多いか。実は何も表示しなくてもユーザ側はおおよそ使い方が分かる…のかなあ。どうなんだろ。

以上です。

過去ログ表示

Prev - 2016/11 - Next
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project