Hacer click a un boton para abrir un archivo pdf en python y QT

publicado por: Anonymous Soy novato programando en Python y mi idea es que al hacer click en el botón que llame “Botonawg” se abra un archivo pdf. Me gustaría que esto funcionara tanto en windows como en sistemas UNIX. Yo uso GNU-Linux ARCh. Hice este código pero me da el siguiente error: NameError: name ‘QtCore’…(Continue Reading)

ディレクトリを取得すると、場合によっては、スラッシュとバックスラッシュが入り混じるのはどうしてでしょうか?

投稿者: Anonymous from PySide import QtGui from PySide import QtCore import sys import os class DirectoryPrinter(QtGui.QWidget): def __init__(self,parent=None): super(DirectoryPrinter,self).__init__(parent=None) self.filedialog_pushbutton = QtGui.QPushButton(“filedialog”,self) self.connect(self.filedialog_pushbutton,QtCore.SIGNAL(“clicked()”),self.filename_getter) def filename_getter(self): print(“os.getcwd()から得られたディレクトリです。”,os.getcwd()) filename = QtGui.QFileDialog.getOpenFileName(self,”ファイルを選択”,os.path.expanduser(“~”))[0] print(“QFileDialogから得られたFileDialogの名前です。”,filename) def main(): try: QtGui.QApplication([]) except Exception as e: print(22,e) directoryprinter = DirectoryPrinter() directoryprinter.show() sys.exit(QtGui.QApplication.exec_()) if __name__ == “__main__”: main() 結果 os.getcwd()から得られたディレクトリです。 J: QFileDialogから得られたディレクトリです。 C:/Users/*******/hello.py スラッシュが全く逆になる現象です。…(Continue Reading)

¿Cómo puedo solucionar el error de la ausencia del uic en PyQt5?

publicado por: Anonymous Estoy trabajando con Qt Designer, y al momento de querer ver el código Python de la interfaz que he hecho (View Code), me genera ese mensaje de error mostrado en la imagen. Como ven tengo instalado PyQt5, no el 4 y tengo Python 3.6 Necesito saber cómo solucionar este error. Muchísimas Gracias…(Continue Reading)

QApplication が2度目に必ずエラーを吐く現象について

投稿者: Anonymous from PySide import QtGui import sys class Widget(QtGui.QWidget): def __init__(self,parent=None): super(Widget,self).__init__(parent=None) def main(): try: QtGui.QApplication([]) except Exception as e: print(10,e) widget = Widget() widget.show() sys.exit(QtGui.QApplication.exec_()) if __name__ == “__main__”: main() これは何の変哲もない、Widgetを表示するだけのプログラムです。 お聞きしたいのは、QApplicationについてです。 QApplicationは、最初はエラーなく実行されるのですが、 2回目からは、必ずエラーを吐きます。ウィジェットをクローズしても、 カーネルは、QApplication()が一度実行されたことを覚えていているようで、 カーネルを再起動しない限り、再度実行する事ができません。 追記: そのため、try:except文でこのエラーを回避することにより、コードを実行しています。 もしこの文が無ければ、 A QApplication instance already exists. と書かれたRunTimeErrorが発生します。 他のQtユーザーたちは、そういう事が無いように思うのですが、 このエラーが発生しない方法はありますか? おもちの実行環境では、そのようなことはありませんか? 開発環境は Anaconda3 Spyder3.2.4です。 解決 【補完】[PySide] QtDesignerで遊ぼうという記事に関連しそうな記載がありました。…(Continue Reading)

pyqtで隠しボタンのようなものを作りたい

投稿者: Anonymous pyqt5で画像をクリックしたときに動作する機能を付けたいです。そこで次のようなコードを書いてみました。 import sys from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QApplication, QPushButton, QLabel, QLineEdit) from PyQt5 import* from PyQt5.QtGui import * from PyQt5.QtCore import * class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): font=QtGui.QFont(“00コミック7”,20) self.setStyleSheet(“background-color: #80ff80”) img=QPixmap(“ぶりぶりざえもん.jpg”) btn=QPushButton(“”) btn.setIcon(QIcon(img)) btn.setIconSize(QSize(337,400)) lbl=QLabel(self) lbl.setPixmap(QPixmap(img)) layout=QVBoxLayout() layout.addWidget(btn) layout.addWidget(lbl) self.setLayout(layout) self.setWindowTitle(‘Absolute’) self.show() if __name__ == ‘__main__’: app =…(Continue Reading)

PyQT – Cambiar entre ventanas con StackedWidget

publicado por: Anonymous Dividí la aplicación en partes, pero por ahora sólo quiero que funcione cuando trato de cambiar entre ventanas (sin crear una nueva o cerrarla). Esto lo estoy haciendo con botones. Abre bien sin problemas y empieza en el menu principal, y en el hay un botón que te lleva al segundo menu…(Continue Reading)

QSoundで出力した音がシステム音になる。

投稿者: Anonymous QSoundを使って、WAVEファイルを再生したいと思っています。サンプルとしてhello.wavというWAVEファイルを作成し、それを使ってテストをしてみようと思ったのですが、ポーン!というシステム音が出るだけで、全くヘローといってくれません。  そのWAVEファイルをダブルクリックすると、ちゃんとそれなりのソフトでは、ITunesやMicrosoft Media Player等、ほか色々では、ちゃんとヘローとあいさつしてくれます。どこかコードに悪いところがあるのでしょうか?   Microsoft Windows The underlying multimedia system is used; only WAVE format sound files are supported. Wavファイルしか使えないようです。以下がサンプルコードです。 from PySide import QtGui from PySide import QtCore import sys import os class HelloSpeaker(QtGui.QPushButton): def __init__(self,parent=None): super(HelloSpeaker,self).__init__(parent=None) self.setText(“再生”) self.connect(self,QtCore.SIGNAL(“clicked()”),self.play_sound) def play_sound(self): sound = QtGui.QSound(os.getcwd()+”hello.wav”) sound.play(os.getcwd()+”hello.wav”) def main(): try: QtGui.QApplication([]) except Exception as…(Continue Reading)

Qtで新しいウィジェットを表示した後でも、フォーカスが移らないようにしたい。

投稿者: Anonymous 例えば日本語のキーボードや、中国語のキーボードのように、リストウィジェットを出してその後スムーズに元の編集へと帰りたいのですが、フォーカスがそちらの方へ移ってしまいます。 すぐに元のエディタへと戻るように、フォーカスを変化させたいのですが、どうすればよろしいでしょうか? ちなみに、テキストエディタは、MainWindowに備えられたQGraphicsViewに、QGraphicsSceneを備えた上で、セットされたQTextEditの場合とします。 色々Focus系をいじってみたのですが、いまいちわかりませんでした。 追記 前までは、releaseEvent内に入れていたコードを、リストウィジェットをshow()した後に入れ込めば、すぐにリストウィジェットが消え、元の処理に帰ることができました。 しかし、私が現在実装しようとしているコードは、なぜかフォーカスがはずれてしまい、カーソル自体が点滅しなくなり、どこにカーソルがあるのかわからなくなります。 focusWidget()で調べても、確かにその編集中のウィジェットがフォーカスを有していますし、なぜこのようなことが起るのかわかりません。 どこにフォーカスが移ったとしても、その後フォーカスを、常にピンポイントでダイレクトにセットするような、そんな方法はご存知ありませんか? 以下はサンプルコードです。 from PySide import QtCore from PySide import QtGui import sys class MainWindow(QtGui.QMainWindow): def __init__(self,parent=None): super(MainWindow,self).__init__(parent=None) self.mainview = QtGui.QGraphicsView() self.mainscene = QtGui.QGraphicsScene() self.maintextedit = CustomTextEdit() self.mainscene.addWidget(self.maintextedit) self.mainview.setScene(self.mainscene) self.setCentralWidget(self.mainview) class CustomTextEdit(QtGui.QTextEdit): def __init__(self,parent=None): super(CustomTextEdit,self).__init__(parent=None) self.listwidget = QtGui.QListWidget() self.listwidget.setFocusPolicy(QtCore.Qt.NoFocus) def keyPressEvent(self,event): self.listwidget.show()        self.listwidget.clearFocus() self.activateWindow() self.setFocus()…(Continue Reading)

pyqt5でボタンの間のスペースが残ってしまう

投稿者: Anonymous pyqt5でボタンをレイアウトするとき、setSpacing(0)を使えばウィジット間のスペースを最小にすることが出来ます。これを使って、次のようなコードを書いてみました。 import sys from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QApplication, QPushButton, QLabel, QLineEdit) from PyQt5 import* from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): #font=QtGui.QFont(“00コミック7”,20) btn1=QPushButton(“1”) btn1.setFixedSize(100,100) btn2=QPushButton(“2”) btn2.setFixedSize(120,100) btn3=QPushButton(“3”) btn3.setFixedSize(50,70) btn4=QPushButton(“4”) btn4.setFixedSize(90,120) btn5=QPushButton(“5”) btn5.setFixedSize(150,50) btn6=QPushButton(“6”) btn6.setFixedSize(70,100) btn7=QPushButton(“7”) btn7.setFixedSize(30,140) btn8=QPushButton(“8”) btn8.setFixedSize(100,100)…(Continue Reading)

¿Cómo aplicar estilo CSS a GUI usando QtDesigner?

publicado por: Anonymous Quiero agregarles estilos CSS a las ventanas y botones de mi proyecto realizado en Python y PyQt, a través de Qt Design. ¿Dónde y cómo agrego el código CSS? solución Para establecer Qt Style Sheets a traves de Qt Designer debes hacer click derecho sobre el widget, aparecera un menu, en este…(Continue Reading)

pyqt5のレイアウトでボタンとボタンの間の隙間をなくしたい

投稿者: Anonymous pyqt5のレイアウトでボタンとボタンの間の隙間をなくしたいです。例えば次のようなコードを書いたとします。 import sys from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QApplication, QPushButton, QLabel, QLineEdit) from PyQt5 import* from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): font=QtGui.QFont(“00コミック7”,20) btn1=QPushButton(“1”) btn1.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) btn2=QPushButton(“2”) btn2.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) btn3=QPushButton(“3”) btn3.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) btn4=QPushButton(“4”) btn4.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) layout=QHBoxLayout() layout2=QVBoxLayout() layout2.addWidget(btn2) layout2.addWidget(btn3)…(Continue Reading)

ビットの深さに応じて処理を振り分けたい

投稿者: Anonymous PILとnumpyを使用してイメージの配列を取得しています。 その情報を、QImageのコンストラクタに渡して、Imageオブジェクトをこさえています。 その時、QImageのコンストラクタの第五引数に対して、フォーマットの情報を渡します。 例えば、24bitの画像に対しては、QtGui.QImage.Format_RGB888を渡します。 変換の目安としては、PILの場合、”L”が8bitを、”RGB”が24bitを、”RGBA”が32bitを表わし、modeを取得して、”L”か”RGB”か、”RGBA”かで適用するフォーマットを分けていました。 #filenameはimageの名前あるいはディレクトリ im = Image.open(filename) print(im.mode) data = np.array(im) if im.mode == “RGB”: qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_RGB888) elif im.mode == “RGBA”: qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_RGB32) elif im.mode == “1”: qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_Mono) elif im.mode == “L”: qimagein = QtGui.QImage(data.data,…(Continue Reading)

Modificar texto en QLineEdit cuando se modifique el valor de una variable/atributo de instancia

publicado por: Anonymous Estoy tratando de mandar el valor de un QLineEdit de un módulo a otro en otro módulo al presionar un botón, pero no funciona (simplemente no cambia el texto en el segundo QLineEdit). Este es mi código: Modulo1 from PyQt5.QtWidgets import QMainWindow, QApplication from PyQt5 import uic from main2 import Main2 class…(Continue Reading)

pyqt5でウィンドウをスクリーンの中央に表示したい

投稿者: Anonymous pyqt5でウィンドウをスクリーンの中央に表示したいです。例えば次のコードで表示されるウィンドウがスクリーン中央に表示されるためにはどうすればよいのでしょうか。 import sys from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QApplication, QPushButton, QLabel, QLineEdit) from PyQt5 import* class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): font=QtGui.QFont(“00コミック7”,20) # ラベル名の設定 lbl1 = QLabel(‘1行目’) lbl1.setFont(font) lbl2 = QLabel(‘2行目’) lbl2.setFont(font) lbl3 = QLabel(‘3行目’) lbl3.setFont(font) self.edit1=QLineEdit() self.edit1.setFont(font) self.edit2=QLineEdit() self.edit2.setFont(font) self.edit3=QLineEdit() self.edit3.setFont(font) btn1=QPushButton(“1”) btn1.setFont(font) btn1.setStyleSheet(“background-color: #ffcf54”) btn2=QPushButton(“2”) btn2.setFont(font) btn2.setStyleSheet(“background-color: #ffcf54”)…(Continue Reading)

fileをデータごとに作り出すことはベストプラクティスか?file,io,pickle系処理の関係性とは?

投稿者: Anonymous Qtで開発をしている者です。  質問の動機  例えば、大量のウィジェットが存在しており、そのウィジェットごとにデータが格納されているとします。極端な話、そのウィジェット毎に、保存データのファイルを作成するのは、処理としてはあり得ない方法でしょうか?  というのは、アプリを立ち上げた際に、一気にロードをするのではなくて、GUI上の何らかのアクションが生じた時に、そのウィジェットに対応したものを、その都度それに応じたファイルをロードするようにしたらいいのではないかと考えました。  今までは全ての情報を、シーケンスで一つ~三つのファイルにまとめてそれを取り出したいデータごとに吸い出していました。 a,b,cというファイルを、ひとつのアプリで、aのファイルを選べばaのデータが、bを選べばbのデータが、cを選べばcのデータがそれぞれ吸い出されるようにしていたのです。  しかし、今回、aをさらに分割し、aというデータが保持しているウィジェット1についての情報を、a-1ファイルへ、ウィジェット2についての情報をa-2ファイルへと、個別化してみたいと考えています。同様に、bが持っているウィジェット1についての情報は、b-1ファイルへ、以下略。    ただ分割しまくるというのは、危険な行為のように思えてしまいます。自分には、ファイルは多くても三~四という先入観があり、openとcloseを繰り返し、後は名前に番号さえ入れてやれば、理論上は大量に増やせるのはわかります。  データの永続化については保存と取り出しが出来ただけで感動していたのですが、かなり大切な部分だという意識が高まってきました。(お答え次第によってはすぐにしぼんでしまうかもしれませんが)  聞きたいこと  プロフェッショナルな方達からすると、ファイルは用途に応じていくらでも作ったほうがよいのでしょうか?それとも、できるだけ少なくした方がよいでしょうか?ものの本などを見ても、ファイルの作り方、取り出し方などはよくみるのですが、  「一つのアプリの、あるデータが保持しているすべての情報に対して、その情報を一定のルール区切り毎に(1000のウィジェットが保有しているデータなら1000のファイルを)分割して、その数だけ作成する事」  は、worseな選択肢でしょうか。データベースはあまり利用したくないです。  ちなみに多分多くとも100~300になろうと思いますが、場合によってはファイルの量が増えすぎて、検索に支障が出て、かえって時間がかかったりしてしまいそうな気がしています。これはやめておいたほうがいいでしょうか?  ぼやき:seekについて  ひょっとして、こういうことをしないで済むために、ファイルを全部読み込むことなく、部分的な高速アクセスを図る方法が、seekというものなのでしょうか?一回一回分割したファイルにアクセスするのではなく、特定のseek位置へ移動してから読み込むべきということでしょうか。File系列の話の際には、よく見るメソッドですけれども、今まで利用する機会がありませんでした。  こちらが使えるのならば、こちらを検討した方がいいでしょうか?よく使い方がわかりませんが、QFileも、保持中のデータをマップ化して、オフセット指定をして特定のデータのみにアクセスできるという方法があると耳にしたことがあります。こちらを検討したほうがいいかなぁともかんがえています。公式を見ているのですが、ランダムアクセスサポートという事で、大きな間違いではなさそうです。しかし、QDataStreamで登録しているのに、QIODeviceしか[seek][3]メソッドはないし・・・。いろんなものがごぎゃまぜになっているデータのなかからseekするというのも、試さず嫌いで敬遠していました。質問も質問としてまとまる気にならず、実際自分は、QFile,QIODevice,QDataStream,QTextStream,pythonに引き直すと、open(),io(),pickle()?等の明確な違いがあまりわからず、教科書通りに処理していました。     ぼやきのあとで  今改めて考えてみますと、fileは、データが入っているポイントを探し当てる物。そしてそれにに焦点を当てるためのクラス。io系のメソッドは取り出された一枚のデータが書かれているシートを走査して、情報を書き込んだり、読み取るための、ある意味コピー機のフラッシュのような役目。次に、pickle等は、ioがよみとった情報を、バイトコードやテキストファイルに変換し、fileに埋め込む役目をしているという理解で問題ないでしょうか?とすると、ioがseekメソッドをもつというのもわかります。しかし、seekは、ioという段階にありながらも、情報をよみとれるというのがいまいちピンときません。読み取る相手がバイト列か単なるテキスト文字列かは、Dataの種類によって異なる気も致します。  初心者の頃からもやもやしてました。  聞きたいこと2 聞きたいことで聞いたことを代わりに行うのがseekメソッドなのでしょうか? fileと、io,そしてpickle等の永続化3点セットの関係性を、氷解させてくれるようないい説明、たとえ噺などはございませんか?  まとめ  まとめると、自分のやろうとしているのは、fileのような、データの入っている箱を選ぶ段階で、個別具体的にするべきか?あるいは、データの入っている箱を選ぶ段階ではなく、その箱を見付けた後で、その箱の中から都合の良いデータを選ぶ処理をするべきか?という話に要約されるのではないかなとおもうようになりました。一言でいうと、このような疑問になりますが、どなたか詳しい方おねがいいたします。 python 3.6.5 Pyside 1.2.4     解決 ファイルにデータを保存するというのは、管理者以外からの入力がないという条件であれば有力な方法です。Qtで開発しているということはデスクトップアプリで、データベースはあまり利用したくないということはこの条件に該当すると思います。こういうケースでは、MySQLをインストールするのは手間です。それに、ファイルだとエディタで簡単に修正できるし、gitで履歴管理もできます。 データを約10万件のファイルにしてlinuxサーバーで実際に運用していますが、処理時間は以下のようなもので、処理が単純なだけデータベースを使うより速いです。2回同じコマンドを入力しているのは、1回目はリブートしてキャッシュがなされていない場合で、2回目はキャッシュされている場合です。 [email protected]:/var/cache/weather$ time ls -U meta | wc -l 118578 cdreal 0m0.510s user 0m0.041s sys 0m0.463s [email protected]:/var/cache/weather$ time…(Continue Reading)

Qt系でWordの表の挿入のような事はできますか?

投稿者: Anonymous PySideでWordライクなテキストエディタを作っている者です。 Wordの表の挿入という機能があります。マウスで表が伸び縮みするし、改行に合わせて伸縮してくれるので、とてもいいものです。PySideでそれに対応する最も近いクラスが、QTextTableというものなんですけれども、(だと思う)これは非常に扱いずらいです。唯一の美点は、デフォルトの導入自体は割と優しいということです。  これを改良する方法や、いいやり方があるという事をご存知の方は教えていただけませんでしょうか?なんか、希望が見えないクラスです。   Blockは通常、一行を意味しますが、設定次第によっては、数文字分でブロックを区切ることも可能のようです。ここら辺のドキュメントがかなり少なく、どうすればいいのかわからないです。  これらと組み合わせて使えば、QTextTableも、もう少しよくなる気はしています。 そういう意味で、合わせてお聞きしたいと思っています。  デフォルトでは、以下の欠点があります。  ・もし改行やウラッピングで行が増えると、TextTableの全体的な大きさは変化しない。例えば、2×2のテーブルがあり、左上のテーブルでテキストを編集し、それが2~3行分になると、もう2列目のテーブルは機能しなくなります。  ・上の全体的な大きさを変化させるための楽なメソッドがない。本家でもどうやってこれにアクセスするのかという質問が見られました。この方は、一つのブロックが2行3行と大きくなると、どんどんそのブロックの大きさを変えようという試みをしようとしたと、私の経験からも推察できます。 QTextTableの、RowHeightsへのアクセスをするには?  ・せっかく苦労して編集しても、BackSpaceキーで操作を誤ると一発で消える。   これは一応、Ctrl+Z等で元に戻すことは可能。  ・ワードライクエディタの中でこれを導入すると、1ページ全体に広がり、しかも何ページもついてくる。   なので、最初の大きさを固定化しておかなくてはならない。何かと動作が静的なのです。セット前に全てのデータの範囲や大きさを見究めなくてはならず、柔軟な編集が困難です。 早い話が、セットしたら、その枠内で収まるような文字しか入れ込むことはできません。 一つ一つのセルの横幅と縦幅が自在に楽に変化できるようなメソッドがあれば別ですが、どうやらそういうものは見当たらないみたいです。全く使えないという事は無いんですが、Wordと比べると、機能性が全くなく、プログラマ次第で改変できると思ってたのですが、なんかとっかかりがつかめません。もう表というよりは、表のカタチをした一文字に近いです。このクラスを提供してくれるよりは、こういう表フレームをどうやってこさえたのかを教えてくれたほうがいいくらいです。QWidget系のクラスを継承しているわけではないので、キー操作やマウス操作にもなじみません。  ワードの表の挿入にあるようなことをPySideでしたいと思っているのですが、そうしたことは可能でしょうか?  追記  私はワードライクエディタを作成した際に、初めてQTextTableに触れたので、 気が附かなかったのですが、何の変哲もない通常のQTextEditで、QTextTableを 挿入したところ、上記のような欠点のうち、行の幅が増えても使えなくなるという事はなく、 割と使い心地のいいクラスだという事がわかりました。  上のような挙動が起きるのは、ほかに原因がありそうです。思い当たる節としては、PageSize に強制的に合うようにTextTableが自動で拡張されているように思います。pageSizeを変更したことが、一つのきっかけになっているかも知れません。 表の駒数と入れられた表の数がマッチしていませんが、これはスクリーンショットで別々にとったからです。状況としては、見ていただくように、一気にページ最下部まで表がずぼっと延びます。 そして、行を増やしたりでもしたら、次から次へとページが増えていきます。これはどういうことなのかなと思います。逆に、何の変哲もないQTextEditで同様のことを行えば、このような事は起きません。 これを防ごうとして、QTextTableを色々といじった結果、冒頭から語っているような現象が起きました。ページが最下部まで延びることはなくなったのですが、その代わり伸縮してくれなくなりました。   すると、 3×4の表を挿入し、改行でもウラッピングでも何でもいいんですが、合計で縦の長さが4行分を超えると、もう完全におかしくなります。これが当初抱えていた問題です。 解決 現在生じているバグを直す方法 QTextTableのTextTableFormatは、QTextFrameFormatを継承しています。 そして、QTextTableの幅や高さは、そのQTextEdit配下のQTextDocumentに、生来的に備わっているrootFrameの幅や高さに依存しているようです。 rootFrame = doc.rootFrame() で、ルートフレームのフレームフォーマットのプロパティを変更すれば、ドキュメントのrootFrameの矩形範囲を変更することが出来ます。 私は、QTextDocumentの高さや幅をいじっている際に、rootFrameの高さをいじってしまいました。これが原因で、その高さに一致するように、textTableの高さも一致してしまっていたのでした。どおりで何の変化もさせていないQTextEditでは普通に動いていたはずです。   改行や行を入れ込んだとしても、 問題ナッシング。 Wordほどのクオリティは無いにしても、十分通用すると思います。つまり、悪いのはTextTableではなく、私だったという事です。 UPDATE Qt系でMicroSoft WordのTableの挿入と同じ事ができますか?というのが主題だったので、こちらも答えておきます。Qtでは、QTextTableでも十分なほどの機能が備わっていますが、 もしCustomizeした設定を組み込みたいのであれば、QAbstractTextDocumentLayoutをサブクラス化して、必要なメソッドを再定義したうえで、QTextDocumentにセットする必要があります。 QAbstractTextDocumentLayout API Referenceからの抜粋です。 Some applications,…(Continue Reading)

Expresión regular para negar las letras en QlineEdit

publicado por: Anonymous Estoy generando una calculadora con un QlineEdit. Quiero utilizar una expresión regular para negar las letras y que solo acepte números y símbolos. Para ello ocupé la siguiente sintaxis. self.regexp = QtCore.QRegExp(‘^[a-z]’) #Expresion para eliminar letras self.validador= QtGui.QRegExpValidator(self.regexp) self.lineEdit.setValidator(self.validador) pero no funciona. Hasta donde he podido entender lo que estoy haciendo es…(Continue Reading)

pyqt5でQPixmapで読み取った画像を保存したい

投稿者: Anonymous pyqtでQPixmapで読み取った画像を、選んだフォルダー内に保存したいです。下は試しに書いてみたコードです。 import sys from PyQt5.QtWidgets import * from PyQt5 import QtGui from PyQt5.QtGui import * class Main(QDialog): def __init__(self, parent=None): super(Main, self).__init__(parent) font=QtGui.QFont(“00コミック7″,20) global img img=QPixmap(‘グリーングリーン.jpg’) self.label = QLabel() self.label.setPixmap(img) foldabtn=QPushButton(‘FldaSave’) foldabtn.clicked.connect(self.foldasave) layout = QVBoxLayout() layout.addWidget(self.label) layout.addWidget(foldabtn) self.setLayout(layout) self.setWindowTitle(‘text’) self.show() def foldasave(self): foldaname=QFileDialog.getExistingDirectory(self,”save folda”) img.save(foldaname,”JPG”) if __name__ == ‘__main__’: app = QApplication(sys.argv) win…(Continue Reading)

pyqt5で表示したグラフを任意のフォルダー内に保存したい

投稿者: Anonymous pyqt5で表示したグラフを選択したフォルダーに保存したいです。まず、次のようなGUIを作成しました。 ここで、Saveのボタンを押したときに次のようなフォルダ選択ダイアログが出て、選んだフォルダ内にグラフが画像データとして保存されるようにしたいです。 以下に、実際に書いたコードを載せます。 import sys from PyQt5 import QtWidgets from PyQt5.QtWidgets import QFileDialog from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar import matplotlib.pyplot as plt import random class Window(QtWidgets.QDialog): def __init__(self, parent=None): super().__init__(parent) self.figure = plt.figure() self.axes = self.figure.add_subplot(111) # We want the axes cleared every time plot() is…(Continue Reading)

Como agregar solo números en QLineEdit PyQt5

publicado por: Anonymous Como puedo validar un QLineEdit para que solo acepte números y aparezca un mensaje de advertencia al ingresar texto? Dejo el código de mi modulo: from PyQt5 import QtCore, QtWidgets, QtGui from untitled import Ui_MainWindow class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self): super(MainWindow, self).__init__() self.setupUi(self) self.btn2.clicked.connect(self._clear) self.btn3.clicked.connect(self.close) self.btn1.clicked.connect(self.calcmts) def _clear(self): self.valor1.clear() self.valor2.clear() def calcmts(self):…(Continue Reading)

QPixmapやQMediaの画像やサウンドをpickleのように一つにまとめたい

投稿者: Anonymous pyqtで表示する画像やサウンドを一つのファイルにまとめたいです。そこでそれらをpickle化しようと思い、次のようなコードを書いてみました。 import pickle from PyQt5 import QtWidgets,QtMultimedia from PyQt5.QtWidgets import * img=QPixmap(“画像.png”) img2=QPixmap(“画像2.jpg”) list_image=[img,img2] save_file=open(“image_list.dat”,”wb”) pickle.dump(list_image,save_file) save_file.close() sound=QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(“サウンド.wav”)) sound2=QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(“サウンド2.wav”)) sound_list=[sound,sound2] save_file2=open(“sound_list.dat”,”wb”) pickle.dump(sound_list,save_file2) save_file2.close() しかし、これを実行すると TypeError: can’t pickle QMediaContent objects や TypeError: can’t pickle QPixmap objects と出力されます。QPixmapやQMediaはpickleに対応していないようです。これらの情報を一つのファイルにまとめるにはどうすればよいのでしょうか。pickle以外に対応しているものはあるのでしょうか。それともpickleでもうまくやれば十分カバーできるのでしょうか。 解決 QPixmapオブジェクトを保存する方法について 既に解決されたようですが、既存のpyqtを使った方法を残しておきます。 pyqtでは、以下の方法によって、簡単にセーブとロードを行うことが出来ます。 file = QtCore.QFile(anyfile) file.open(QtCore.QIODevice.ReadWrite) out = QtCore.QDataStream() image = QtGui.QPixmap()#An object you costomized.Please…(Continue Reading)

pyinstallerで作成したexeファイルが起動しない

投稿者: Anonymous python3.5を使っています。pyqt5を使って作ったGUIをpyinstallerでexeファイルに直してみました。できたexeファイルを起動しようとすると、 This application failed to start because it could not find or load the Qt platform plugin “windows” in “”. Reinstalling the applicaton may fix this problem. と出力され、起動しません。どうすれば良いのでしょうか。 解決 必要なpluginが実行ファイルと同じフォルダ内に入っていないとダメなようです。pluginはpyinstallerでexe化する際にファイルを一つにまとめないように(–onefileをかかない)するとできるPyQt5というフォルダの中に入っていました。 回答者: Anonymous

socket.recv()の待機時間中に、PyQt5のプログレスバーを進めたい

投稿者: Anonymous 実現したいこと PyQT5を使って簡単なGUIを作っています。 その際、ソケット通信を行いサーバから受け取ったデータをGUI上に表示しようと思っています。 そこで、socketモジュールのsocket.recv()を使ってデータを受けとるようにしましたが、 socket.recv()の待機時間が10秒ほどあり、その間、プログレスバーで時間経過を表示したいです。 実装したコード 以下のようにコードを実装してみましたが、 socket.recv()の待機時間中はプログレスバーが止まってしまいます。 具体的な改善点などして頂けると助かります。 import socket import sys from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit, QTextEdit, QGridLayout, QApplication, QPushButton, QProgressBar, QSizePolicy) from PyQt5.QtCore import QBasicTimer import threading class Example(QWidget) def __init__(self): self.button = QPushButton(“Run!”) self.button.clicked.connect(self.threading_wrapper) self.pbar = QProgressBar(self) #18/06/22 追記 self.pbar.setGeometry(30, 40, 200, 25) #18/06/22 追記 self.step = 0…(Continue Reading)

メインウィジェットが消されれば、フローティング中のダイアログやウィジェット等も同時に消したい。

投稿者: Anonymous Qtで開発をしているんですけれども、ダイアログ等のように、ポップアップするウィジェットを 作成したり、ドックウィジェットのように、フローティングするウィジェットがある場合、それが表示されているときに、一番のメイン画面を消すことがあります。そういう時、出現中のウィジェットも同時に消すようにしたいのですが、その場合はどうすればいいでしょうか。長らく放っといた問題なんですが、表示される可能性のあるウィジェットをあらかじめどこかのコンテナに入れておいて、closeEvent()時に全てチェックするしかないでしょうか? 解決 自己解決 質問に書いての通り、closeEventをオーバーライドし、フローティングする可能性のあるウィジェットを終了時に調べてしまうのが、一番いいと思います。 def closeEvent(self,event): if self.add_dialog.isVisible(): self.add_dialog.close() dialogは、一時的に表れる画面としてよく設定されますが、上のようにしていけば、あまりにも大量に出てくるようなアプリケーションでない限り、さほど労せずチェックできるはずです。  バグ取の問題だと思います。 (追記 2018/4/1) ほかの方法を見付けました。 PySide.QtGui.QApplication.closeAllWindows() これを、closeEvent配下に入れてしまいましょう。もうクローズ残しは心配いりません。 回答者: Anonymous

QMenu テキストやアイコンではなく、ウィジェット自体で表示したい

投稿者: Anonymous QMenuで、QActionを表示したいのですが、 テキストやアイコンではなく、ウィジェットそれ自体をアクションとして 扱いたいです。例えば、Wordなどでいえば、アンダーラインスタイルを 変更するのに、ダッシュラインや、ドットラインなどのテキストによる 指示ではなく、____________ や、_ _ _ _ _ _ _ _等の図が、メニューに 現れるようにしたいのですが、どなたか方法をご存知ありませんか? 下に現在トライ中のコードを置きました。メニューは押すと、ごみ粕みたいな ウィジェットらしきものが出ます。resizeなどで元のウィジェットのサイズを かえようとしても、変わりません。paintEvent内は冗長なコードになっていますが ご容赦ください。 from PySide import QtGui from PySide import QtCore import sys class Window(QtGui.QMainWindow): def __init__(self, parent=None): super(Window, self).__init__(parent) self.menubar = QtGui.QMenuBar() self.a_menu = QtGui.QMenu(“a-menu”) self.a_menu.resize(500,10) self.label_A = UnderlineStyleLabel(self.a_menu,QtGui.QTextCharFormat.WaveUnderline) self.label_A.resize(500,10) self.widgetAction = QtGui.QWidgetAction(self.a_menu) # self.widgetAction.setText(“DashDotDotLine”) self.widgetAction.createWidget(self.label_A) self.widgetAction.setDefaultWidget(self.label_A)…(Continue Reading)

global宣言は一度だけすればいいというものではないのか

投稿者: Anonymous  初歩的なことなのですが、global変数に関する問題です。 from PySide import QtGui import sys class GlobalTest(QtGui.QTextEdit): def __init__(self,parent=None): super(GlobalTest,self).__init__(parent=None) def closeEvent(self,event): if g_is_modified == True: message = QtGui.QMessageBox().warning(None,”Warning-警告”,”書き換えられた内容があります。このまま閉じてもよろしいですか?n”,QtGui.QMessageBox.Ok,QtGui.QMessageBox.Cancel) if message == QtGui.QMessageBox.Ok: pass else: return print(15,global_widget.parent() == self) return QtGui.QTextEdit.closeEvent(self,event) def focusInEvent(self,event): print(“focus キタ”) global g_is_modified g_is_modified = True global_widget.setParent(self) return QtGui.QTextEdit.focusInEvent(self,event) def main(): try: QtGui.QApplication([]) except Exception as e:…(Continue Reading)

pyqt5で簡単な画像処理をしたい

投稿者: Anonymous pyqt5で画像を等高線のように表示するGUIを作りたいです。画像を等高線のように表示するコードは次のように書けます。 from PIL import Image, ImageOps, ImageFilter import numpy as np import matplotlib.pyplot as plt # 画像読み込み img = Image.open(‘300.png’) # グレースケール化 img = ImageOps.grayscale(img) # ぼかし img = img.filter(ImageFilter.GaussianBlur(3)) # 配列化 data = np.asarray(img) # 等高線 plt.contour(data) # 描画 plt.show() これで、 のような画像が このように変換されます。これを踏まえて、pyqt5を使ってGUIを書いたものが次のコードになります。 import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import…(Continue Reading)

Qtの商用ライセンスを購入すると、特典はどれほどのものなのか?

投稿者: Anonymous 以前、PySideで開発したもののそのあとどうすればいいかわからない。で質問をしました。 私は主体の取り違えを起こしていました。商用ライセンスは、開発者が定めてもいいにも関わらず、私は、購入しなければいけないものだと思っていたのです。購入をして、初めて自分の作品でお金とっていいですよ。という感じ。商売用ライセンスだと思っていたのです。しかし、こうした購入する商用ライセンスというものもあるわけで、以前の解答と合わせて考えると、どうやら、Qt開発者が、自分の開発したライブラリであるQtの商用ライセンスを購入したらこういう特典があるよという話だったようです。 Q1. 例えば、こういうQtの特典を商用ライセンス購入によって得た場合、このSOFで質問しても解決できないような、みなさんがお知りにならないような疑問も、サポートしてもらえるものなのでしょうか? The Qt Company’s expert support team helps you solve your development challenges. と書いてあります。Qtについては、以前からあまり盛んでないものを対象とした質問を出していますが、どうにも解答が付かなくて、何らかの手段がないものか探していました。   それと、ライセンスについて、以前お聞きしたものの、整理がつかなくなってしまったのです。 QtのLGPL版について 私が過去主体を取り違えたときに読んだものがここです。 Qtのライセンスについての考察 これがわかりやすかったかも。 緑之庵 私の製品について、商用ライセンスを発行するのは私なのでしょう。しかし、いったい何を守って何を守らなくてもいいのやら、正直混乱してしまいました。 簡単に言えば、お上の目を恐れているということです。 Q2. 自分で開発した製品について商用ライセンスを発行するのは開発者 自分で定めた料金を設定し、自由に商売してもよい。 LGPL版Qtで開発したものは、ソースコードの開示は強制されない。しかし、一度公開したら、その後の改変したコードも公開する必要がある。 GPL版Qtで開発したものは、ソースコードの開示は強制される。 Qtの商用ライセンスを購入するというのは、商売するライセンスをもらえるというのではなくて、上のサイトを信頼する限り、GPLの制限が解除され、コードの非公開が可能となる。非公開での改変もOKリバースエンジニアリングの禁止もできる。また、開発にあたっての様々なサポートが得られる。という程度の意味なのですね。 上記のようなとらえ方であっていますか? Q1では、商用ライセンスのサポートはどれほどのものなのか? 具体的には、以前の質問1以前の質問2以前の質問3等、まだ未解決の問題についても、答えてくれそうなサポートなのか? Q2では、以上のような理解で漏れはないのか? ライセンスについてちょっと慎重に行きたいと思っていますので、Q1が最もお聞きしたいことなのですが、Q2も併せて伺いたいと思います。私はGPLよりLGPLのがよさそうだぞと思って、PySideを選んで進んできました。C++ Qtと、PyQt,PySideは、名前は違えど、根底にある理解は一致しているので、Qtの商用ライセンス等でも、全く受けられるサポートには違いはないと思っています。C++のコードで教えられたら何とか行ける程度ですが。   解決 ちょうど今日、Qtブログにサポート関連の記事が投稿されました。 Qt Premium Support: Learning and Experiences 一度読まれることをお勧めします。 なお、GPL / LGPLが議論されていますが、GPL /LGPLを適用したアプリケーション と…(Continue Reading)

QApplication,QClipboard,mimedataで、貼り付けをした後にデータを復元すると、必ずテキストが黒くなる。

投稿者: Anonymous 自分のソフト外の適当なウェブサイトなどから、文章をコピペして、 それをテキストエディタで保存して、再度復元したいと思っています。 例えばなのですが、このサイトからタイトル部分をコピペしてきました。 Matahari Wikipedia すると、こんな感じになります。 Key_1を押して、その内容をセーブしました。 その後、再起動を行い、前のデータを復元してみました。 すると、常に、ロードしたテキストは真っ暗になります。 mimedata.html()を調べてみますと、 <!–StartFragment–><span style=”display: inline !important; float: none; background-color: transparent; color: rgb(0, 0, 0); font-family: &quot;Linux Libertine&quot;,&quot;Georgia&quot;,&quot;Times&quot;,serif; font-size: 28.8px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; line-height: 37.44px; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;”>Matahari</span><!–EndFragment–>…(Continue Reading)

pyinstallerでGUIをexe化したらwavファイルのサウンドが再生できなくなった

投稿者: Anonymous python3.5を使っています。pyqt5を使ってGUIを作りました。その中で、ボタンを押した時に音が出る仕組みを作りました。ここではQtMultimediaのQMediaPlayerを使ってwavファイルを再生しています。このGUIをpyinstallerでexe化しました。すると、ボタンを押しても音が再生されなくなりました。特にエラーは出ておりません。他の機能は問題なく動作します。どうすれば良いのでしょうか。osはwindows8.1の64bitです。音を出すコードとしましては、まず、次のコードのように、pickleファイルから読み取ったwavファイルをフォルダ内に出力します。sound.wavファイルは予めフォルダ内に一つ用意してあります。 os.remove(“sound_tempo.wav”) global sound write(“sound_tempo.wav”,loaded_sound_list[10][0],loaded_sound_list[10][1]) sound=QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(“sound_tempo.wav”)) その後、次のコードのように音を出す関数を起動させています def make_sound(self): self.mediaPlayer.setMedia(sound) self.mediaPlayer.play() 解決 exe化する際にファイルを一つにまとめないように実行すると(–onefileを書かないようにする)PyQT5というフォルダが出来ます。その中のpluginフォルダの中のフォルダ全てを実行exeファイルと同じフォルダに移したら解決しました。 回答者: Anonymous