質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

295閲覧

PySide6でLayoutにaddWidgetする過程をプログレスバー(QProgressDialog)に表示したい。

Terao

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/03/14 11:49

実現したいこと

PySide6でアプリケーションを作っているのですが、Layout に addWidget する量が多くてUIが固まってしまうのをプログレスバーを表示することで解決したいです。

発生している問題・分からないこと

QThreadを用いてQProgressDialogに表示する場合、後ろで動いている重たい処理をスレッド処理にする例はたくさん見つかったのですが、UIの更新(addWidget)自体が重たくなる例が見つからなかったので質問させていただきます。

該当のソースコード

Python

1import sys 2import time 3 4from PySide6.QtWidgets import * 5 6 7class MainWindow(QMainWindow): 8 def __init__(self, parent=None): 9 super(MainWindow, self).__init__(parent) 10 11 self.bStart = QPushButton("Start") 12 self.ylay = QVBoxLayout() 13 main_lay = QVBoxLayout() 14 main_lay.addWidget(self.bStart) 15 main_lay.addLayout(self.ylay) 16 17 self.setCentralWidget(QWidget()) 18 centralWidget = self.centralWidget() 19 centralWidget.setLayout(main_lay) 20 21 self.bStart.pressed.connect(self.run) 22 23 def run(self): 24 for i in range(500): 25 self.ylay.addWidget(QLabel(str(i))) 26 time.sleep(.005) 27 28 29if __name__ == '__main__': 30 app = QApplication(sys.argv) 31 win = MainWindow() 32 win.show() 33 sys.exit(app.exec())

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

参考例の TaskThread の run() 内に MainWindow の ylay を渡しながら addWidget を呼んでみたりしたのですが、上手くいきませんでした。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

UIの更新(addWidget)自体が重たくなる例が見つからなかったので質問させていただきます。

半年前なので、解決済かも知れませんが、

バックグラウンドでの処理の過程をUI側でモニターリングしたい場合は、
スレッドからはシグナルをだし、シグナルに結び付けられた SLOT 側でUI更新を行う方法が一般的です。
※ シグナルを稼働させるには QThread を用います、Python のスレッドではありません。

今回提示のコードで問題になっているのは、スレッドは使われずに
メインスレッドで重たいループを稼働させている点にあります。

重たくなる原因は、runメソッドはメインスレッドで実行され、処理をGUIのイベントループに返していない点。
SLOT で呼び出す関数は必ず処理を即座に終わらせないと、GUIがフリーズします。

一時的な解決策、
time.sleep を取りやめ、時間のかかるループの中で
QCoreApplication.processEvents() を定期的に呼び出すことで、
UI が固まる症状は改善できます。

解決策としては、参考例のコード通りQThread と SIGNAL/SLOT の仕組みを使う方法を強くお勧めします。
※ 相違点: 質問のコードと違い QThread を継承したクラスを用いてます。

投稿2024/12/02 20:42

teamikl

総合スコア8817

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問