MENU
  • ホーム
  • プログラミング
  • ワードプレス
    • プラグインプラグイン関連記事
    • 賢威賢威のカスタマイズ
    • CSSCSSの関連記事
  • サイト情報
    • プライバシーポリシー
  • ツール
    • メルエディター
    • フリマスパイダー – 疾風
    • フリマスパイダー
    • -ポイ活くんα-
  • お問い合わせ
あらゆるモノにHackする、探究者の読み物。
Let's Hack Tech
  • ホーム
  • プログラミング
  • ワードプレス
    • プラグインプラグイン関連記事
    • 賢威賢威のカスタマイズ
    • CSSCSSの関連記事
  • サイト情報
    • プライバシーポリシー
  • ツール
    • メルエディター
    • フリマスパイダー – 疾風
    • フリマスパイダー
    • -ポイ活くんα-
  • お問い合わせ
Let's Hack Tech
  • ホーム
  • プログラミング
  • ワードプレス
    • プラグインプラグイン関連記事
    • 賢威賢威のカスタマイズ
    • CSSCSSの関連記事
  • サイト情報
    • プライバシーポリシー
  • ツール
    • メルエディター
    • フリマスパイダー – 疾風
    • フリマスパイダー
    • -ポイ活くんα-
  • お問い合わせ
  1. ホーム
  2. プログラミング
  3. 言語別
  4. Python
  5. PyQt5 QListWidget の item削除でtextBoxのフォーカスが奪われる

PyQt5 QListWidget の item削除でtextBoxのフォーカスが奪われる

2023 3/05
Python
2023-03-05
目次

この問題はWindows固有の問題

とりあえず自分の環境で確認する限り、Macでは起きてません。

バックグラウンドでQListWidgetの内容を常時更新するようなマルチスレッドな状態で、テキストボックスにフォーカス中(テキストを編集中)にQListWidget内のQListItemが削除されるような動作を行うと、編集中のテキストボックスからフォーカスが外れたような挙動になる。

フォーカスが外れるというよりはエンターを押されているような挙動かもしれない。

とりあえず、ウザい。

原因

原因はとりあえず判明してる限り、上で述べたようにQListWidget内のQListItemを削除するようなアクションを取った時。

  • list_widget.clear()
  • list_widget.takeItem(i)

この両方で確認。

QListWidgetが表示中かどうかは関係ない。裏に隠れててもこの現象は起きる。

なんだったらlist_widget.setUpdatesEnabled(False)で描画のアップデートを抑制しても起きる。

根本的な原因はよくわからん。(分かる人教えて)

解決策(回避策)

テキストボックスにフォーカスがある時はQListWidgetを更新しない(Itemを削除しない)という処理をすればOK.

def list_widget_update(self):
    # アップデートの冒頭でフォーカスがどこにあるかを判定する
    # QApplication.focusWidget() でアプリケーション内の現在のフォーカスのオブジェクトを取得可能
    # isinstance で目的のテキスト編集系のクラスと比較しTrueなら抜ける
  if isinstance(
        QApplication.focusWidget(),
        (QtWidgets.QLineEdit, QtWidgets.QPlainTextEdit)):
        # ただ抜けるだけだと芸がないので、フォーカスがテキストボックスから外れるまで再帰的にupdateにディレイを入れる処理
    print('list_widget_update(): delay update because focus textbox, retry 5 sec later')
    QTimer.singleShot(5000, self.list_widget_update)
    return
    # これ以降はフォーカスがテキストボックス外にないと辿りつかない
  # 実際にQListWidgetのItemを削除する処理はこれ以降に書く

とりあえず回避。

ちなみにQApplication.focusWidgetはchatGPTに教えてもろたやで。GPT最高!

Python
PyQt
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする コメントをキャンセル

email confirm*

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

シンプル美と機能性を両立させた、国内最高峰のWordPressテーマ『SWELL』
人気記事
  • IQテストいくつか受けてみました
    ネット上で信憑性がありそうなIQテスト、5種類まとめて受けた結果…
  • hayate
    メルカリの商品を世界最速で購入するためだけのアラートツール
  • 【Python】BeautifulSoupの使い方・基本メソッド一覧|スクレイピング
  • Pythonファイルのexe化
    【悲報】PyInstallerさん、300MBのexeファイルを吐き出すようになる
  • Amazon Echo アレクサのコマンドまとめ
    AmazonEchoの使い方とできる事、アレクサへの指示コマンド一覧
最近の投稿
  • 正規表現処理の濁点でハマった話2024-12-12
  • 保護中: 疾風v2更新履歴2024-05-31
  • 【自営・経営者向け・税金も】クレジットカードガチ勢による最強クレカ解説2023-10-23
  • PyQt5 QListWidget の item削除でtextBoxのフォーカスが奪われる2023-03-05
  • WordPressからのメールが届かない時の調査と解決法2023-02-27
目次
目次