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

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

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

Q&A

解決済

1回答

4734閲覧

QListWidgetにセットされているアイテムの背景色を取得したい

ookura

総合スコア27

0グッド

0クリップ

投稿2020/11/09 06:50

前回質問でQlistwidgetに背景色を設定する方法を質問したものです。
今回は反対に、設定した背景色の取得をしたいのですがうまくいきません。
背景色設定が.setbackgroudなら取得は.background().color())でいけると思ったのですが
設定した背景色の Qt.lightGrayを取得できればよいのですが・・・

度々申し訳ありませんが
お詳しい方、ご教示いただけますと幸いです。

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\ookura\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 # ファイルを変更した時の関数 103 def FileList_Changed(self): 104 # 選択しているファイルの名前を取得 105 self.FileName = self.FileList.selectedItems()[0].text() 106 # 画像を読み込み 107 self.load_ImageFile() 108 # Figureを更新 109 self.update_Figure() 110 111 # 画像ファイルを読み込む 112 def load_ImageFile(self): 113 # 画像を開く 114 image = Image.open(self.root + self.FileName) 115 # numpy.ndarrayに 116 self.image = np.asarray(image) 117 118 # Figureを更新 119 def update_Figure(self): 120 self.axis_image.set_data(self.image) 121 self.FigureCanvas.draw() 122 #テーブル 123 def createTable(self): 124 # Create table 125 #self.tableWidget = QTableWidget() 126 self.tableWidget.setRowCount(20) 127 self.tableWidget.setColumnCount(5) 128 self.tableWidget.setItem(0,0, QTableWidgetItem("Cell (1,1)")) 129 self.tableWidget.setItem(0,1, QTableWidgetItem("Cell (1,2)")) 130 self.tableWidget.setItem(0,3, QTableWidgetItem("Cell (2,1)")) 131 self.tableWidget.setItem(0,4, QTableWidgetItem("Cell (2,2)")) 132 self.tableWidget.setItem(0,5, QTableWidgetItem("Cell (3,1)")) 133 self.tableWidget.setItem(0,6, QTableWidgetItem("Cell (3,2)")) 134 self.tableWidget.setItem(3,0, QTableWidgetItem("Cell (4,1)")) 135 self.tableWidget.setItem(3,1, QTableWidgetItem("Cell (4,2)")) 136 self.tableWidget.setItem(0,0, QTableWidgetItem("Cell (1,1)")) 137 self.tableWidget.setItem(0,1, QTableWidgetItem("Cell (1,2)")) 138 self.tableWidget.setItem(1,0, QTableWidgetItem("Cell (2,1)")) 139 self.tableWidget.setItem(1,1, QTableWidgetItem("Cell (2,2)")) 140 self.tableWidget.setItem(2,0, QTableWidgetItem("Cell (3,1)")) 141 self.tableWidget.setItem(2,1, QTableWidgetItem("Cell (3,2)")) 142 self.tableWidget.setItem(3,0, QTableWidgetItem("Cell (4,1)")) 143 self.tableWidget.setItem(3,1, QTableWidgetItem("Cell (4,2)")) 144 self.tableWidget.move(500,1000) 145 146 # table selection change 147 #self.tableWidget.doubleClicked.connect(self.on_click) 148 149 @pyqtSlot() 150 def on_click(self): 151 print("\n") 152 for currentQTableWidgetItem in self.tableWidget.selectedItems(): 153 print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text()) 154 155 def test_buttonClicked(self): 156 print(self.FileList.item(0).background().color()) #ここが不明 157 158 159 160#imread再編(.open読み込み不可) 161def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8): 162 try: 163 n = np.fromfile(filename, dtype) 164 img = cv2.imdecode(n, flags) 165 return img 166 except Exception as e: 167 print(e) 168 return None 169 170#画像加工 171def process(path): 172 img_or = imread(path) 173 174 #dst = cv2.fastNlMeansDenoisingColored(img_or, None, 10, 110, 7, 21) 175 # グレースケール化 176 img_gray = cv2.cvtColor(img_or, cv2.COLOR_RGB2GRAY) 177 # 2値化(100:2値化の閾値/画像を見て調整する) 178 # ret,thresh1 = cv2.threshold(img_gray,100,255,cv2.THRESH_BINARY) 179 ret, thresh1 = cv2.threshold(img_gray, 180, 255, cv2.THRESH_BINARY) 180 # ノイズ処理(モルフォロジー変換) 181 kernel = np.ones((3, 3), np.uint8) 182 img_opening = cv2.morphologyEx(thresh1, cv2.MORPH_OPEN, kernel) 183 184 return img_opening 185#OpenCV型→PIL型に変換 186def cv2pil(image): 187 ''' OpenCV型 -> PIL型 ''' 188 new_image = image.copy() 189 if new_image.ndim == 2: # モノクロ 190 pass 191 elif new_image.shape[2] == 3: # カラー 192 new_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 193 elif new_image.shape[2] == 4: # 透過 194 new_image = cv2.cvtColor(image, cv2.COLOR_BGRA2RGBA) 195 new_image = Image.fromarray(new_image) 196 return new_image 197#読み取り位置調整 198 199 200path = r"C:\Users\ookura\Desktop\test.jpg" 201 202QApp = QtWidgets.QApplication(sys.argv) 203app = Application() 204app.show() 205sys.exit(QApp.exec_())

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

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

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

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

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

guest

回答1

0

ベストアンサー

背景色設定が.setbackgroudなら取得は.background().color())でいけると思ったのですが
設定した背景色の Qt.lightGrayを取得できればよいのですが・・・

色情報を得るなら .background().color() で正解です。

前回の回答では端折ってしまった部分なのですが、

setBackground の取れる引き数は、
QBrush, QColor, Qt.GlobalColor, QGradient の何れかで、
実際に格納されるデータは、色情報から作られた QBrush オブジェクトになります。

Gt.lightGray は、Qt.GlobalColor という enum で定義された型の為、
実体はパレット番号の様な整数値で、これ自体は色情報を持ちません。

python

1>>> Qt.lightGray 26

色として扱うなら、QColor オブジェクトの方が良いと思いますが、

元のオブジェクトが必要な場合は、
.background().color().name()"#c0c0c0" の様な文字列を得られるので
変換用の辞書を用意して、元の値に戻す事になります。

https://doc.qt.io/qt-5/qt.html#GlobalColor-enum

比較用途なら、Qt.GlobalColor に戻さなくとも QColor のままでも使えます。

python

1>>> Qt.lightGray 26 3 4>>> QColor("#c0c0c0") 5<PyQt5.QtGui.QColor object ad 0xXXXXXX> 6 7# 同じ色として判別される 8>>> Qt.lightGrary == QColor("#c0c0c0") 9True 10 11# 同じオブジェクトではない 12>>> Qt.lightGrary is QColor("#c0c0c0") 13False 14 15# enumとしての値(lightGray: 6) は、別の型との比較には使えない 16>>> 6 == QColor("#c0c0c0") 17False 18 19>>> 6 == Qt.lightGray 20True

追記:

もし、色情報をアイテムの状態として扱っているなら、
setData メソッドで独自のデータを格納する方法も検討して見て下さい。

setBackground も内部では、setData を用いて背景の情報を保持していますが、
スタイルシートを適応した場合、見た目の色と background() の情報が一致しないことがあります。

投稿2020/11/10 06:38

編集2020/11/10 06:47
teamikl

総合スコア8664

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

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

ookura

2020/11/10 07:18

毎度本当にありがとうございます。 今回も即解決した上に勉強までさせていただけました。 ご教示いただいた内容でプログラムを組み上げてみます! ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問