Hello World / plɹoM ollǝH

Programmers Live in Vain

PySide

読み取り専用にできるチェックボックスを作る

class MyCheckBox(QCheckBox): def __init__(self, in_text=None): super().__init__(in_text) self._readOnly = False def isReadOnly(self) -> bool: return self._readOnly def setReadOnly(self, readonly: bool): self._readOnly = readonly def mouseP…

QListWidgetItemの位置やサイズを調べる

QListWidget::visualItemRectを使う。 例えばキーボードでコンテキストメニューを出したいとき等に使える。 class MyList(QListWidget): def __init__(self): super().__init__() def keyPressEvent(self, event): if event.key() == Qt.Key_Backspace: item…

QLineEditでEnter(Return)押したとき、フォーカスが勝手に移動してしまうのを防ぐ

何故かデフォルトの挙動ではフォーカスが他の場所に移動してしまう現象が発生したため、ラップして解決。 class MyLineEdit(QLineEdit): def __init__(self): super().__init__() def keyPressEvent(self, event): if event.key() == Qt.Key_Return: self.ed…

QLineEditのCtrl+Zを無効化する

eventFilterをいれれば解決できるようだが、eventLoopで毎回呼ばれるのか、パフォーマンスプロファイラ―などを使って調べてみるとこいつが上位に来るようになってしまう。必要なときだけ呼ばれるeventFilterようなものがあれば良いが、現在調査中。 class My…

QDialogを継承したダイアログ作成

QDialogButtonBoxを使うようにするとAccept, Rejectを使って直感的にDialogクラスとやりとりできるし、キーを押したときの挙動も統一できる(Enter押すとAcceptとか)。 class MyDialog(QDialog): def __init__(): super().__init__() buttons = QDialogButt…

QTreeWidget カレント項目を削除する

_index = self._treeWidget.indexOfTopLevelItem(self._treeWidget.currentItem()) self._treeWidget.takeTopLevelItem(_index)

QComboBox 開いたときにアイテムを生成する

showPopupを継承してその中でaddItemし直せばよい class ComboBox(QComboBox): def __init__(self): super().__init__() def showPopup(self): while self.count() > 0: self.removeItem(0) self.addItem('hoge') self.addItem('fuga') self.addItem('piyo')…

PySide drag start from QPushButton

Qt (PySide) は一部のWidget以外でドラッグ開始を実装しようとすると意外と面倒 ググると大体受け入れる側のサンプル出てきちゃうし class MyButton(QPushButton): def __init__(self, parent): super().__init__(parent) self._startPos = QPoint() def mou…

PySide2 + librosa + pyaudio + numpy, play audio repeatedly

import librosa import numpy as np import pyaudio from PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtWidgets import * import sys class Widget(QWidget): def __init__(self): super().__init__() self._audio = pyaudio.PyAudi…

PySide2 ダイアログの「?」ボタンを非表示にする

QApplication.setAttribute(Qt.AA_DisableWindowContextHelpButton)

QFileSystemModel + QListView Auto Scrolling on Init

QFileSystemModelにはdirectoryLoadedというSignalがあるのでそこで処理する default_path = '*****' def on_directory_loaded(): i = self._model.index(default_path) view.setCurrentIndex(i) view.scrollTo(i, QAbstractItemView.EnsureVisible) model =…

pyside scoped signal blocking

IMPLEMENTS class ScopedBlockSignals: def __init__(self, obj): self.obj = obj def __enter__(self): self._recursiveSet(self.obj, True) def __exit__(self, _exc_type, _exc_val, _exc_tb): self._recursiveSet(self.obj, False) def _recursiveSet(se…

pip install PySide2

いつの間にかPySide2がpip installできるようになっているではありませんか

PySide2 メモ

Qt for Python is coming to a computer near you https://blog.qt.io/blog/2018/04/13/qt-for-python-is-coming-to-a-computer-near-you/

Qt ビルドする(GPL版)

リリースDLLのPDBが欲しかったのでビルドする ここを見れば大体わかる https://doc.qt.io/qt-5.6/windows-building.html わしの環境 Windows10やで Visual Studio 2015をインストールしているものとする とりあえず Qt5.10.1 Qtダウンロード Qtのホームペー…

PySide2 終了時のメモリアクセスエラー

原因調べるのが面倒くさいので困ります from PySide2 import QtWidgets import sys if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) main = QtWidgets.QMainWindow() action = QtWidgets.QAction(main) action.setText('Action') action…

PySide keyPressEventが反応しないとき

もしかして self.setFocusPolicy(QtCore.Qt.StrongFocus) し忘れているんじゃないでしょうか。

PySide1と2でQScrollArea::wheelEventの動作が若干違う

違うんじゃあああああああああああああああああぁぁぁぁあああばばばっばばばば # from PySide2.QtWidgets import * from PySide.QtGui import * import sys app = QApplication(sys.argv) class MyWidget(QWidget): def wheelEvent(self, event): print('ho…

QTimer.singleShotをサブスレッドで使うには

呼び出しスレッド側でexec関数をよんでイベントループを開始せよ QTimer Class | Qt 4.8 In multithreaded applications, you can use QTimer in any thread that has an event loop. To start an event loop from a non-GUI thread, use QThread::exec(). Q…

PySide2 ビルドしてみる

ここ見たら大体書いてあるよ https://wiki.qt.io/PySide2_GettingStarted PySide2最新の状況はこのへんをチェック https://bugreports.qt.io/projects/PYSIDE https://gitter.im/PySide/pyside2 環境 Windows10 Python 3.6 (64bit) Qt 5.6 OpenSSLは使わない…

PySide Custom Dialog

Dialogを自分で実装するときのポイント QDialogを継承する ボタン表示にはQDialogButtonBoxを使う こんなかんじ from PySide import QtCore, QtGui import sys class CustomDialog(QtGui.QDialog): def __init__(self): super().__init__() self._buttons = …

PySide 編集可能なQTreeWidgetを作る

import sys from PySide import QtCore, QtGui class MyTreeWidget(QtGui.QTreeWidget): def __init__(self): super().__init__() self.setHeaderHidden(True) self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.customContextMenuRequested.con…

PySide movable and resizable widget without frame

import sys, enum from PySide import QtCore, QtGui class Item(QtGui.QLabel): Manipilate = enum.Enum('Manipilate', 'none move resize_l resize_r') def __init__(self, text): super().__init__(text) self.setStyleSheet('background-color: white; b…

PySide Progressbarを表示してみる

QProgressDialogを使うと一番簡単であります import sys from PySide import QtGui app = QtGui.QApplication(sys.argv) prog = QtGui.QProgressDialog('何か処理しています...', 'キャンセル', 0, 100, None, 0) prog.show() prog.setValue(50) sys.exit(ap…

QScrollAreaに固定されたヘッダーを表示する

import sys from PySide import QtGui class MyTable(QtGui.QWidget): def __init__(self): super().__init__() lo = QtGui.QHBoxLayout() lo.setContentsMargins(0, 0, 0, 0) lo.setSpacing(0) self.setLayout(lo) self._header = QtGui.QLabel('header') s…

PySide ドラッグでデータ受け渡し

import sys from PySide import QtCore, QtGui # ドラッグ&ドロップで色を受け渡す class WidgetItem(QtGui.QLabel): def __init__(self, color): super().__init__('') self._color = color self.setStyleSheet('border: 1px solid black;') self.setFixed…

PySide ドラッグでWidgetを移動させる

import sys from PySide import QtCore, QtGui # ドラッグで動くWidget class WidgetItem(QtGui.QLabel): def __init__(self): super().__init__('') self.setStyleSheet('border: 1px solid black; background-color: red;') self.setFixedSize(32, 32) sel…

PySide: Asynchronously Text Filtering

QThreadを使った非同期テキストフィルタ ほしいもの 別スレッドで実行されるテキストフィルタ 一定時間ごとにフィルタリング済みのデータを返す 途中でキャンセルもしたい コード from PySide import QtCore, QtGui import datetime import time class Filte…

PySide: Save and Restore QDockWidgets

Dockの生成削除込みでQSettings保存 適当に調べた QSettingsを使用してWidgetの位置やサイズを保存できる 復元する前にWidgetを生成してobjectNameを設定しておく必要がある DockWidgetを追加・削除できるプログラムではその状況も保存する必要がある QMainW…

PySide: Suppress the clicked signal when emitting a contextMenuRequested signal

右クリックでコンテキストメニューを出すときに一緒にclickedシグナルが発信されると困るケースがあった。mousePressEventとmouseReleaseEventを継承して左クリックのみに反応するようにしてこれを回避した from PySide import QtGui, QtCore import sys cla…