FrontPage / Python / PySide

** pyqtSlotの便利な使い方 [#vf04575c]
http://t2y.hatenablog.jp/entry/20101114/1289713526


** PySide import 方法 [#oca875b9]
    try:
        from PySide.QtCore import *
        from PySide.QtGui import *
        qt = 1
    except:
        try:
            from PyQt4.QtCore import *
            from PyQt4.QtGui import *
            qt = 2
        except:
            raise Exception('Error load PyQt or PySide')

** メモリリーク対策 [#f6b532d3]
  self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
def __init__()の中で上のオプションを宣言しておく。Qtは閉じるボタンだけではメモリは解放されないため、ウィンドウを開き続けるとメモリリークを生じる。上のオプションでメモリが解放される。

** PySide or PyQt の使い分け [#g04e0027]

 if use_pyside:
    from PySide import QtGui, QtCore
 else:
    from PyQt4 import QtGui, QtCore

** qt designer [#k6bf2aeb]

[[Qt Designer を使った画面の作成と表示>http://log.noiretaya.com/259]]

>PySide をインストールすると、一緒に Qt Designer も入っています。 場所はちょっとわかりづらいですがPython のインストール場所\Lib\site-packages\PySide内にdesigner.exeがあります。 英語ですが、特に問題なく使用できます。

*** ui ファイルを直接読み込む場合 [#bece77e9]

    import os
    import sys
    from PySide import QtGui, QtUiTools
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        # Ui Loader
        loader = QtUiTools.QUiLoader()
        # Ui ファイルを読み込んでオブジェクトを取得
        ui = loader.load(os.path.dirname(os.path.abspath(sys.argv[0])) + "/Ui.ui")
        # 表示
        ui.show()
        # 各ウィジェットなどは、デザイナーで設定した名前でアクセスできる
        ui.exit_action.triggered.connect(app.quit)
        sys.exit(app.exec_())


*** .uiファイルを.pyファイルに変換して使う [#tc3ed044]

 pyside-uic.exe Ui.ui > Ui_.py


    from PySide.QtCore import *
    from PySide.QtGui import *
 
    from Ui_2 import *
 
    class MainWindow(QMainWindow, Ui_MainWindow):
 
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            self.setupUi(self)
 
    if __name__ == "__main__":
        app = QApplication([])
        w = MainWindow()
        w.show()
        sys.exit(app.exec_())

** PySideでMaplotlibのウィジェットを使う方法 [#h0930a18]

[[→Embed Matplotlib into PyQt as a custom widget>http://stackoverflow.com/questions/21250488/embed-matplotlib-into-pyqt-as-a-custom-widget]]


*** FigureCnavasの継承クラス [#b29698f8]

[[→Custum FigureCanvas>http://matplotlib.org/examples/user_interfaces/embedding_in_qt4.html]]

** Widgetでドラッグドロップを使う [#ydc7c9f8]

#prettify{{
class MainWidget(QWidget):
    def __init__(self, parent=None):
        super(MainWidget, self).__init__(parent)
        
        self.setWindowTitle(u"D&D")
        self.resize(160, 120)
        self.setAcceptDrops(True)
    
    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.accept()
        else:
            event.ignore() 
    
    def dropEvent(self, event):
        cmd = [sys.executable, sys.argv[1]] + \
              [unicode(u.toLocalFile()) for u in event.mimeData().urls()]
        exit(subprocess.call(cmd))

}}

** QWidgetの背景色を変更する [#t3ced8c2]
- 変更する方法は2種類
+ QPalleteを使う方法

 widget = QWidget()
 palette = QPalette()
 palette.setColor(QPalette.Background, Qt.black
 widget.setAutoFillBackground(True)
 widget.setPalette(palette)

+ スタイルシート(CSS)を使う方法

 widget = QWidget()
 widget.setStyleSheet("background-color:white;")
 widget.show()

+ 背景の描画をOFF
        self.setAttribute(Qt.WA_TranslucentBackground, True)

** lineEditの文字が変更されたら、ラベルに追加 [#nbb7bab8]

    self.line_edit = QLineEdit()
    layout.addWidget(self.line_edit)
    self.label = QLabel()
    layout.addWidget(self.label)
    self.line_edit.textChanged.connect(self.line_edit_text_changed)
    self.show()

    def line_edit_text_changed(self, text):
        self.label.setText(text)


** ステータスバーにフラッシュ [#b2c7fc06]

 self.statusbar.showMessage("Error!!! Please check Email and keyfile....")


** SIGNALとSLOT [#qc706ef3]

 class MainWindow(QMainWindow, Ui_MainWindow):
    # シグナルを生成
    # ここじゃないとうまく動かない
    dataLoaded = Signal()
    dataLoaded = Signal(int)



    def analysis(self):
        # シグナル発行
        self.dataLoaded.emit()


    @Slot()
    def changeGAKey(self, key):
        self.ga_key = key
        print self.ga_key



** PyInstaller and PySide のPEMエラー google App API [#dc6005b0]

 NotImplementedError: PKCS12 format is not supported by the PyCrpto library. 
Try converting to a "PEM" (openssl pkcs12 -in xxxxx.p12 -nodes -nocerts > privatekey.pem) or using PyOpenSSL if native code is an option.

[[→SignedJwtAssertionCredentials on AppEngine doesn't recognize PEM key>http://stackoverflow.com/questions/17993604/signedjwtassertioncredentials-on-appengine-doesnt-recognize-pem-key]]

p12ファイルを.pemに変更する


 openssl pkcs12 -in privatekey.p12 -nodes -nocerts > privatekey.pem

pemをpemに

 openssl pkcs8 -nocrypt -in privatekey.pem -passin pass:notasecret -topk8 -out pk.pem



** PySideをCSSでデザイン変更する [#a8577b08]

[[→PySideのUIをCSSでアレンジしてみる>http://www.dfx.co.jp/dftalk/?p=16108]]

 app = QtGui.QApplication(sys.argv)
 # CSSをインポート
 app.setStyleSheet(qcss13())

 def qcss13():
     s = '''
     QMainWindow{
        background-color: #000;
     }'''
     return s



** プログレスバーをステータスバーに表示する [#j1fddcb1]

        self.progressBar = QProgressBar()
        self.statusbar.addPermanentWidget(self.progressBar)
        self.progressBar.reset()
        self.progressBar.setVisible(False)
        self.progressBar.setValue(10)

        self.statusBar().showMessage("File opened"+self.fileName, 2000)

** ドラッグ&ドロップ可能なツリービュー [#od57b49b]
[[http://melpystudio.blog82.fc2.com/blog-entry-115.html]]

** ファイルリストを取り扱う QListView [#ydbd95c1]

[[PySideでリストをカスタマイズするぞ! ~基礎編「model/viewアーキテクチャ」~>http://www.dfx.co.jp/dftalk/?p=14388]]

[[PySideでリストをカスタマイズするぞ! ~応用編「delegate」~>http://www.dfx.co.jp/dftalk/?p=16745]]

** ドラッグアンドドロップを許可する方法 [#z1ef509e]
-         self.setAcceptDrops(True)


** サイズの設定 [#y68a1f6c]
 def minimumSizeHint(self):
  """最小サイズ値の定義(オーバーライド)"""
  return QtCore.QSize(50, 50)

 def sizeHint(self):
   """規定サイズ値の定義(オーバーライド)"""
  return QtCore.QSize(180, 180)

** レンダリング時のアンチエイリアスの指定 [#aaf535f3]
        painter.setRenderHint(QtGui.QPainter.Antialiasing, self.antialiased)
** 座標値のオフセット(オブジェクトの中央に移動) [#b2004962]
        painter.translate(0, self.height() / 2)

** painterクックブック(QPen) [#d2f5a88e]
 def settingLine(self, painter):
	    """ ラインを引く
	    ラインを引くためには、QPenオブジェクトを生成し、設定を行う
	    :link: https://srinikom.github.io/pyside-docs/PySide/QtGui/QPen.html
	    :link: http://zetcode.com/gui/pysidetutorial/drawing/
	    """

	    # QPenの生成
	    # :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
	    pen = QtGui.QPen(QtCore.Qt.black, 2, QtCore.Qt.SolidLine)

	    # 線の太さの設定
	    pen.setWidth(3)

	    # Cap Style 線の端部の形状変更
	    pen.setCapStyle(QtCore.Qt.SquareCap)  # 四角
	    pen.setCapStyle(QtCore.Qt.FlatCap)  # 四角
	    pen.setCapStyle(QtCore.Qt.RoundCap)  # 丸

	    # Join Style: 線の角部の形状
	    pen.setJoinStyle(QtCore.Qt.BevelJoin)  # フラット
	    pen.setJoinStyle(QtCore.Qt.MiterJoin)  # 角
	    pen.setJoinStyle(QtCore.Qt.RoundJoin)  # 丸

	    # 線の種類の変更
	    pen.setStyle(QtCore.Qt.SolidLine)  # ソリッド
	    pen.setStyle(QtCore.Qt.DashLine)  # 破線
	    pen.setStyle(QtCore.Qt.DotLine)  # 点線
	    pen.setStyle(QtCore.Qt.DashDotLine)  # 1点破線
	    pen.setStyle(QtCore.Qt.DashDotDotLine)  # 2点は線
	    pen.setStyle(QtCore.Qt.CustomDashLine)  # ユーザ指定
	    pen.setDashPattern([1, 4, 5, 4])

	    # プロパティの適用 (おまじない)
	    painter.setPen(pen)
	    # drawLine(int,int,int,int)
	    painter.drawLine(0, np.ceil(self.height() / 2), self.width(), np.ceil(self.height() / 2))


   
** painterクックブック(文字の書き方) [#d2f5a88e]
    def settingText(self, event, painter):
        """ 文字の書き方
        QtGui.QPainter.drawText(r, flags, text)
        :link: https://srinikom.github.io/pyside-docs/PySide/QtGui/QPainter.html?highlight=drawtext#PySide.QtGui.PySide.QtGui.QPainter.drawText
        """
        # 書きだす文字
        text = 'Graph Title'
        # 文字の色を設定
        painter.setPen(QtGui.QColor(168, 34, 3))
        # 文字のフォントと、文字サイズを設定
        painter.setFont(QtGui.QFont('Decorative', 30))

        # テキストの表示位置
        # :::::::::::::::::::::::::::::::::::
        # QtCore.Qt.AlignLeft
        # QtCore.Qt.AlignRight
        # QtCore.Qt.AlignHCenter
        # QtCore.Qt.AlignJustify
        # QtCore.Qt.AlignTop
        # QtCore.Qt.AlignBottom
        # QtCore.Qt.AlignVCenter
        # QtCore.Qt.AlignCenter
        # QtCore.Qt.TextDontClip
        # QtCore.Qt.TextSingleLine
        # QtCore.Qt.TextExpandTabs
        # QtCore.Qt.TextShowMnemonic
        # QtCore.Qt.TextWordWrap
        # QtCore.Qt.TextIncludeTrailingSpaces

        painter.drawText(event.rect(), QtCore.Qt.AlignHCenter, text)
        # painter.drawText(event.rect(), QtCore.Qt.AlignTop|QtCore.Qt.TextWordWrap, text)
        # painter.drawText(int(x0), int(y0), int(w), int(h), QtCore.Qt.AlignLeft, self.text)


** painterクックブック [#w290bceb]
        pen.setColor(QtCore.Qt.black)
        pen.setWidth(2)
        painter.setPen(pen)
        painter.setBrush(QtGui.QBrush(QtCore.Qt.green, QtCore.Qt.Dense7Pattern))
       
      qpoints = [QtCore.QPointF(radius * np.sin(2. * np.pi / N * i)*self.rcData_normarized[i], -1. * radius * np.cos(2. * np.pi / N * i)*self.rcData_normarized[i]) for i in
                   range(0, N)]
        poly = QtGui.QPolygonF(qpoints)
        painter.drawPolygon(poly)

** Window 最前面に表示 [#l8654496]
        # 最前面に表示
        self.setWindowFlags(Qt.WindowStaysOnTopHint)
** Window 枠を非表示 [#c23d29f0]
        # 枠を非表示
        self.setWindowFlags(Qt.FramelessWindowHint)
** タイトルにヴァージョンを表示 [#h5a535cf]
 __version__ = '1.0'
 self.setWindowTitle(QApplication.translate("Widget", "Paired Comparison %s"%(__version__), None, QApplication.UnicodeUTF8))
** スタイルの変更 [#q799fcad]
qtDesignerのPreferences>Print/Previewからも確認できます。(プレビューのみ)

 if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setStyle('plastique')

 ・plastique
 ・motif
 ・cde
 ・gtk
 ・cleanlooks 
 ・windows
 ・windowsxp (winのみ)
 ・windowsvista (winのみ)
 ・macintosh (macのみ)

cleanlooksかplastique以外は、グレーバック。

** 名前を付けて保存ダイアログ [#z5715185]
 filename, ext = QFileDialog.getSaveFileName(self, "Save file", "", ".csv")
 # 保存場所を開いてあげると親切
 from subprocess import Popen
 def save_figure(self):
        filename, ext = QFileDialog.getSaveFileName(self, "Save file", "", ".png")
        QPixmap.grabWidget(self).save("clipboad.png")
        QPixmap.grabWidget(self).save(filename)
        # エクスプローラをオープン
        cmd_file = 'explorer /select, "%s"' % (os.path.normpath(filename))
        Popen(cmd_file)

** リソースファイルを使う方法 [#s8f06b7c]
http://log.noiretaya.com/259
http://flame-blaze.net/archives/3041

パスを通す
 PATH C:Anaconda2_32bit\Lib\site-packages\PySide\
変換
 pyside-rcc -py2  Resource.qrc > Resource_rc.py
インポート
 import PC_Momentum_Logger.Resource_rc

 <RCC>
    <qresource prefix="/" >
        <file>jquery.min.js</file>
        <file>overwrite.css</file>
    </qresource>
 </RCC>

** MDI [#q3eda39f]
https://github.com/PySide/Examples/blob/master/examples/mainwindows/mdi/mdi.py

** QGraphicsのサンプル [#b9f37471]
** QGraphics [#cee43648]
QGraphicsView, QGraphicsScene, QGraphicsItem関連の情報収集。

PySideで画像の表示とドラッグ移動
http://blawat2015.no-ip.com/~mieki256/diary/20150626.html

PyQtでイメージビューワ
http://melpystudio.blog82.fc2.com/blog-entry-138.html

[PYSIDE] GRAPHICSVIEWで遊ぼう その1 基本
http://flame-blaze.net/archives/5219

** QGraphicsの使い方 [#e10d6840]
 # 処理系おまじない 
  self.setCacheMode(QGraphicsView.CacheBackground)
   self.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform | QPainter.TextAntialiasing)

 localRect  = self.boundingRect()         # 自身の矩形範囲

** QWidgetの画面を画像保存 [#ac2c0082]
    def save_figure(self):
        QPixmap.grabWidget(self).save("clipboad.png")

** Windows対応:日本語フォルダも扱う [#l2254d3e]
 path = unicode(url.toLocalFile()) ※ strでは使えない
 # ドラッグドロップしてきたファイルにはこう使えばよい
 files = [unicode(u.toLocalFile()) for u in event.mimeData().urls()]


** QWebkitを使ってWebサイトを表示 [#t51d2681]
        # ブラウザの作成
        self.browser = QWebView(self)
        # URLの設定
        self.browser.load(QUrl('http://localhost/Recomen/www/strong-player.html'))
        # レイアウトにアタッチ
        vbox.addWidget(self.browser)
       # 親レイアウトに合わせて伸縮する設定
        # self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)

** QtWebkitのオプション一覧 [#j70817a4]
http://trac.webkit.org/wiki/ConfigurableFeatures

** Youtubeの観覧 [#p82d4335]
初期状態ではプラグインの許可がなく動画再生できない
 self.browser.settings().setAttribute(QWebSettings.PluginsEnabled, True)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS