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

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

新規登録して質問してみよう
ただいま回答率
85.48%

Q&A

解決済

1回答

3306閲覧

Qlistwidgetでitemの選択状態を解除したい

ookura

総合スコア27

0グッド

0クリップ

投稿2020/11/11 00:33

listwidgetにaddされたitemに対して、gui起動時にインデックスが0のものを選択するようにしています。

一度リストをリセットする動作が必要だったので.clearをしようと思ったらエラーが発生しまして、試行錯誤するといずれかのitemが選択状態でclearするとエラーが発生する状態に気づきました。

一度itemの選択状態を解除できればいいのですが、どのように記述すれば解除できるでしょうか。
ご教示いただけますと幸いです。

python

1# -*- coding: utf-8 -*- 2 3import numpy as np 4from PIL import Image 5import sys 6import pyocr.builders 7import cv2 8import sys 9import os 10 11from PyQt5 import QtWidgets,QtCore 12from PyQt5.QtWidgets import QInputDialog,QProgressBar, QPushButton, QRadioButton,QMessageBox,QLineEdit,QVBoxLayout,QTextEdit,QLabel,QTableWidget, QTableWidgetItem,QGridLayout 13from PyQt5.QtCore import pyqtSlot 14from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas 15import matplotlib.pyplot as plt 16import glob 17from PyQt5.QtCore import Qt 18from PyQt5.QtWidgets import (QWidget, QHBoxLayout, 19 QLabel, QApplication) 20from PyQt5.QtGui import QPixmap 21 22class Application(QtWidgets.QWidget): 23 def __init__(self): 24 super().__init__() 25 # UIの初期化 26 self.initUI() 27 28 # rootディレクトリ 29 self.root = r"C:\Users\KAWAMOTO66\Desktop\" 30 # 拡張子 31 self.ext = 'jpg' 32 33 # ファイルを配置 34 self.set_FileList() 35 36 # 画像 37 self.FileName = self.FileList.item(0).text() 38 39 # 画像を読み込む 40 self.load_ImageFile() 41 42 # Figureの初期化 43 self.initFigure() 44 45 # ファイルを変更した時のイベント 46 self.FileList.itemSelectionChanged.connect(self.FileList_Changed) 47 self.FileList.item(0).setBackground(Qt.lightGray) 48 # UIの初期化 49 def initUI(self): 50 # Figure用のWidget 51 self.FigureWidget = QtWidgets.QWidget(self) 52 # FigureWidgetにLayoutを追加 53 self.FigureLayout = QtWidgets.QVBoxLayout(self.FigureWidget) 54 # Marginを消す 55 self.FigureLayout.setContentsMargins(0,0,0,0) 56 # ファイルのリスト 57 self.FileList = QtWidgets.QListWidget(self) 58 #table 59 self.tableWidget = QtWidgets.QTableWidget(self) 60 61 self.hbox = QHBoxLayout(self) # 横方向のレイアウト 62 self.hbox.addWidget(self.FileList) 63 self.hbox.addWidget(self.FigureWidget) 64 #self.hbox.addStretch(0) 65 self.hbox.addWidget(self.tableWidget) 66 self.setLayout(self.hbox) 67 self.resize(1920, 1080) 68 self.createTable() 69 70 self.FileList.move(500,500) 71 #ocrボタン設置 72 btn_test = QPushButton("test", self) 73 btn_test.setStyleSheet("color:black;background-color:white;font-size:14px;font-family:メイリオ;") 74 btn_test.move(1500, 565) 75 # クリックされたらbuttonClickedの呼び出し 76 btn_test.clicked.connect(self.test_buttonClicked) 77 78 # Figureの初期化 79 def initFigure(self): 80 # Figureを作成 81 self.Figure = plt.figure() 82 # FigureをFigureCanvasに追加 83 self.FigureCanvas = FigureCanvas(self.Figure) 84 # LayoutにFigureCanvasを追加 85 self.FigureLayout.addWidget(self.FigureCanvas) 86 87 self.axis = self.Figure.add_subplot(1,1,1) 88 self.axis_image = self.axis.imshow(self.image, cmap='gray') 89 plt.axis('off') 90 91 # ファイルを配置 92 def set_FileList(self): 93 # ファイルの読み込み 94 Files = glob.glob(self.root+'*.'+self.ext) 95 # ソート 96 self.Files = sorted(Files) 97 98 # ファイルリストに追加 99 for file in self.Files: 100 self.FileList.addItem(os.path.basename(file)) 101 102 self.FileList. 103 # ファイルを変更した時の関数 104 def FileList_Changed(self): 105 # 選択しているファイルの名前を取得 106 self.FileName = self.FileList.selectedItems()[0].text() 107 # 画像を読み込み 108 self.load_ImageFile() 109 # Figureを更新 110 self.update_Figure() 111 112 # 画像ファイルを読み込む 113 def load_ImageFile(self): 114 # 画像を開く 115 image = Image.open(self.root + self.FileName) 116 # numpy.ndarrayに 117 self.image = np.asarray(image) 118 119 # Figureを更新 120 def update_Figure(self): 121 self.axis_image.set_data(self.image) 122 self.FigureCanvas.draw() 123 #テーブル 124 def createTable(self): 125 # Create table 126 #self.tableWidget = QTableWidget() 127 self.tableWidget.setRowCount(20) 128 self.tableWidget.setColumnCount(5) 129 self.tableWidget.setItem(0,0, QTableWidgetItem("Cell (1,1)")) 130 self.tableWidget.setItem(0,1, QTableWidgetItem("Cell (1,2)")) 131 self.tableWidget.setItem(0,3, QTableWidgetItem("Cell (2,1)")) 132 self.tableWidget.setItem(0,4, QTableWidgetItem("Cell (2,2)")) 133 self.tableWidget.setItem(0,5, QTableWidgetItem("Cell (3,1)")) 134 self.tableWidget.setItem(0,6, QTableWidgetItem("Cell (3,2)")) 135 self.tableWidget.setItem(3,0, QTableWidgetItem("Cell (4,1)")) 136 self.tableWidget.setItem(3,1, QTableWidgetItem("Cell (4,2)")) 137 self.tableWidget.setItem(0,0, QTableWidgetItem("Cell (1,1)")) 138 self.tableWidget.setItem(0,1, QTableWidgetItem("Cell (1,2)")) 139 self.tableWidget.setItem(1,0, QTableWidgetItem("Cell (2,1)")) 140 self.tableWidget.setItem(1,1, QTableWidgetItem("Cell (2,2)")) 141 self.tableWidget.setItem(2,0, QTableWidgetItem("Cell (3,1)")) 142 self.tableWidget.setItem(2,1, QTableWidgetItem("Cell (3,2)")) 143 self.tableWidget.setItem(3,0, QTableWidgetItem("Cell (4,1)")) 144 self.tableWidget.setItem(3,1, QTableWidgetItem("Cell (4,2)")) 145 self.tableWidget.move(500,1000) 146 147 # table selection change 148 #self.tableWidget.doubleClicked.connect(self.on_click) 149 150 @pyqtSlot() 151 def on_click(self): 152 print("\n") 153 for currentQTableWidgetItem in self.tableWidget.selectedItems(): 154 print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text()) 155 156 def test_buttonClicked(self): 157    #選択状態を解除※不明箇所 158 159 self.FileList.clear() 160 161 162 163#imread再編(.open読み込み不可) 164def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8): 165 try: 166 n = np.fromfile(filename, dtype) 167 img = cv2.imdecode(n, flags) 168 return img 169 except Exception as e: 170 print(e) 171 return None 172 173#画像加工 174def process(path): 175 img_or = imread(path) 176 177 #dst = cv2.fastNlMeansDenoisingColored(img_or, None, 10, 110, 7, 21) 178 # グレースケール化 179 img_gray = cv2.cvtColor(img_or, cv2.COLOR_RGB2GRAY) 180 # 2値化(100:2値化の閾値/画像を見て調整する) 181 # ret,thresh1 = cv2.threshold(img_gray,100,255,cv2.THRESH_BINARY) 182 ret, thresh1 = cv2.threshold(img_gray, 180, 255, cv2.THRESH_BINARY) 183 # ノイズ処理(モルフォロジー変換) 184 kernel = np.ones((3, 3), np.uint8) 185 img_opening = cv2.morphologyEx(thresh1, cv2.MORPH_OPEN, kernel) 186 187 return img_opening 188#OpenCV型→PIL型に変換 189def cv2pil(image): 190 ''' OpenCV型 -> PIL型 ''' 191 new_image = image.copy() 192 if new_image.ndim == 2: # モノクロ 193 pass 194 elif new_image.shape[2] == 3: # カラー 195 new_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 196 elif new_image.shape[2] == 4: # 透過 197 new_image = cv2.cvtColor(image, cv2.COLOR_BGRA2RGBA) 198 new_image = Image.fromarray(new_image) 199 return new_image 200#読み取り位置調整 201 202 203path = r"C:\Users\KAWAMOTO66\Desktop\test.jpg" 204 205QApp = QtWidgets.QApplication(sys.argv) 206app = Application() 207app.show() 208sys.exit(QApp.exec_())

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

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

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

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

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

teamikl

2020/11/11 05:17

エラーログの内容と、問題の現象を再現できる「最小限の」コードを提示して頂けますか。 現状のコードでは、(エラーの再現には)不要な外部ライブラリや、 外部依存のファイルが多数ある為、実行して確認するのが困難です。 >いずれかのitemが選択状態でclearするとエラーが発生する状態 clear は要素の削除と同時に選択状態も解除するので、 エラー自体は他の要因だと思います。 考えられるのは、リストの要素が削除されたのに選択しようとしている等。
guest

回答1

0

ベストアンサー

一度itemの選択状態を解除できればいいのですが、どのように記述すれば解除できるでしょうか。

エラーは確認出来てませんが、選択解除についてのみ

選択状態は、selectionModel というモデルで管理されていて、
このモデルの clear で選択状態の解除ができます。

python

1import sys 2from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QListWidget, QPushButton 3 4def main(): 5 app = QApplication(sys.argv) 6 win = QWidget() 7 listWidget = QListWidget(win) 8 listWidget.addItems(["A", "B", "C"]) 9 button = QPushButton("Clear Selections", win) 10 layout = QVBoxLayout(win) 11 layout.addWidget(listWidget) 12 layout.addWidget(button) 13 14 button.clicked.connect(listWidget.selectionModel().clear) 15 win.show() 16 17 sys.exit(app.exec_()) 18 19if __name__ == '__main__': 20 main()

投稿2020/11/11 05:19

teamikl

総合スコア8664

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

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

ookura

2020/11/11 14:54

今回も助けて頂いてありがとうございます。 仰ったとおり、直接原因は洗濯状態の有無ではなく、存在しないリストを参照しに行っていたことでした。 今回も勉強になりました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問