如何解决值更改时更改颜色组合框
我在带有组合框的Pyqt5中有一个表。我的组合框有2个值:True或False,我想用2种不同的颜色更改Combobox的颜色:当值为True->绿色时,当值为False->红色时。我尝试使用样式表更改颜色,但只能将整个组合框更改为红色或绿色,如下所示:
如何根据其值来更改2种不同颜色的组合框?
我的代码如下:
# -*- coding: utf-8 -*-
"""
Created on Tue Oct 27 09:21:24 2020
@author: actnmk
"""
import sys
from PyQt5.QtWidgets import (QWidget,QLabel,QLineEdit,QTextEdit,QGridLayout,QApplication)
import pandas as pd
import numpy as np
import PyQt5
from PyQt5.QtWidgets import QVBoxLayout,QPushButton,QGroupBox,QHBoxLayout,QMainWindow,QApplication,QFileDialog,QTableWidget,QTableWidgetItem,QTableView,QStyledItemDelegate
from PyQt5 import QtCore,QtGui,QtWidgets
import os
from PyQt5.QtWidgets import (QWidget,QVBoxLayout,QApplication)
from PyQt5.QtGui import QIcon
import re
def dataframe():
lst = [['tom','reacher','True'],['krish','pete',['nick','wilson',['juli','williams','True']]
df = pd.DataFrame(lst,columns =['FName','LName','Student?'],dtype = float)
return df
class Delegate(QtWidgets.QItemDelegate):
def __init__(self,owner,choices):
super().__init__(owner)
self.items = choices
def createEditor(self,parent,option,index):
self.editor = QtWidgets.QComboBox(parent)
self.editor.currentIndexChanged.connect(self.commit_editor)
self.editor.addItems(self.items)
return self.editor
def paint(self,painter,index):
value = index.data(QtCore.Qt.DisplayRole)
style = QtWidgets.QApplication.style()
opt = QtWidgets.QStyleOptionComboBox()
opt.text = str(value)
opt.rect = option.rect
style.drawComplexControl(QtWidgets.QStyle.CC_ComboBox,opt,painter)
QtWidgets.QItemDelegate.paint(self,index)
def commit_editor(self): ####test
editor = self.sender()
self.commitData.emit(editor)
def setEditorData(self,editor,index):
value = index.data(QtCore.Qt.DisplayRole)
num = self.items.index(value)
editor.setCurrentIndex(num)
def setModelData(self,model,index):
value = editor.currentText()
model.setData(index,value,QtCore.Qt.EditRole)
def updateEditorGeometry(self,index):
editor.setGeometry(option.rect)
class PandasModel(QtCore.QAbstractTableModel):
def __init__(self,data,parent=None):
QtCore.QAbstractTableModel.__init__(self,parent)
self._data = data
def rowCount(self,parent=None):
return self._data.shape[0]
def columnCount(self,parent=None):
return self._data.shape[2]
def flags(self,index):
return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
def data(self,index,role=QtCore.Qt.DisplayRole):
if index.isValid():
if role == QtCore.Qt.DisplayRole:
return str(self._data.iloc[index.row(),index.column()])
return None
def headerData(self,col,orientation,role):
if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
return self._data.columns[col]
return None
def setData(self,role=QtCore.Qt.EditRole):
self._data.iloc[index.row(),index.column()] = value
return True
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(300,200,600,400)
self.setWindowTitle('Test')
self.initUI()
def show_data(self):
choices = ['True','False']
self.model = PandasModel(dataframe())
self.table_data.setModel(self.model)
self.table_data.setItemDelegateForColumn(2,Delegate(self,choices))
##make combo boxes editable with a single-click:
for row in range(5):
self.table_data.openPersistentEditor(self.model.index(row,2))
def print_data(self):
print(self.table_data.model()._data)
def initUI(self):
welcom = QLabel('Welcome to my app!')
self.btn_print_data = QPushButton('print data')
self.btn_print_data.clicked.connect(self.print_data) ##test
self.btn_show_table = QPushButton('show data')
self.btn_show_table.clicked.connect(self.show_data)
self.table_data = QTableView()
#self.table_result = QTableView()
hbox1 = QHBoxLayout()
hbox1.addWidget(welcom)
vbox2 = QVBoxLayout()
vbox2.addWidget(self.btn_show_table)
vbox2.addWidget(self.btn_print_data) ####test
vbox3 = QVBoxLayout()
vbox3.addWidget(self.table_data)
#vbox3.addWidget(self.table_result)
hbox2 = QHBoxLayout()
hbox2.addLayout(vbox2)
hbox2.addLayout(vbox3)
vbox1 = QVBoxLayout()
vbox1.addLayout(hbox1)
vbox1.addLayout(hbox2)
self.setLayout(vbox1)
self.show()
style = '''
QComboBox
{
background-color : lightgreen;
}
'''
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet(style)
ex = MyWindow()
sys.exit(app.exec_())
解决方法
注意:代码中有错误,您必须更改为:
def columnCount(self,parent=None):
return self._data.shape[1]
另一方面,解决方案是根据选择更改每个组合框的Qt StyleSheet:
def commit_editor(self):
editor = self.sender()
color = QtGui.QColor()
if editor.currentText() == "True":
color = QtGui.QColor("lightgreen")
elif editor.currentText() == "False":
color = QtGui.QColor("red")
qss = """QComboBox{background-color : %s;}""" % (color.name(),)
editor.setStyleSheet(qss)
self.commitData.emit(editor)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。