** 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)