如何将 QLinearGradient 指定为 QTableView 项目背景颜色
How to assign QLinearGradient as QTableView items background color
使用 QLineEdit 的调色板,我们可以指定 QGradient 作为它的背景颜色:
line = QtGui.QLineEdit()
palette = line.palette()
QRectF = QtCore.QRectF(line.rect())
gradient = QtGui.QLinearGradient(QRectF.topLeft(), QRectF.topRight())
palette.setBrush(QtGui.QPalette.Base, QtGui.QBrush(gradient))
line.setPalette(palette)
line.show()
在使用 QTableView
及其 QAbstractTableModel
时,我 return 从模型的 data
方法中为每个 BackgroundColorRole
请求提供了一个可靠的 QColor
。我宁愿为 tableView "item" 分配一个渐变,而不是纯色。
如何分配渐变而不是纯色?
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Model(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']]
def rowCount(self, parent=QtCore.QModelIndex()):
return 3
def columnCount(self, parent=QtCore.QModelIndex()):
return 3
def data(self, index, role):
if not index.isValid(): return
if role in [QtCore.Qt.DisplayRole, QtCore.Qt.EditRole]:
return self.items[index.row()][index.column()]
if role == QtCore.Qt.ForegroundRole:
return QtGui.QColor("white")
if role == QtCore.Qt.BackgroundColorRole:
return QtGui.QColor("gray")
def onClick(index):
print 'clicked index: %s'%index
tableModel=Model()
tableView=QtGui.QTableView()
tableView.setModel(tableModel)
tableView.clicked.connect(onClick)
tableView.show()
app.exec_()
中的BackgroundRole
用来生成一个QBrush
,可以有一个渐变。请参见下面的示例。 BackgroundColorRole
似乎已过时,因此最好使用 BackgroundRole
,即使您不想要渐变。
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
def create_gradient_brush():
horGradient = QtGui.QLinearGradient(0, 0, 100, 0)
verGradient = QtGui.QLinearGradient(0, 0, 0, 20)
gradient = verGradient
gradient.setColorAt(0.0, QtGui.QColor("blue"))
gradient.setColorAt(1.0, QtGui.QColor("red"))
brush = QtGui.QBrush(gradient)
return brush
class Model(QtCore.QAbstractTableModel):
# The cell size is most likely unavailable in the model, it could be
# different per view, so we make a cell size-independent gradient.
BG_BRUSH = create_gradient_brush()
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']]
def rowCount(self, parent=QtCore.QModelIndex()):
return 3
def columnCount(self, parent=QtCore.QModelIndex()):
return 3
def data(self, index, role):
if not index.isValid(): return
if role in [QtCore.Qt.DisplayRole, QtCore.Qt.EditRole]:
return self.items[index.row()][index.column()]
if role == QtCore.Qt.ForegroundRole:
return QtGui.QColor("white")
# BackgroundColorRole is obsolete, use BackgroundRole,
# which returns a QBrush.
if role == QtCore.Qt.BackgroundRole:
return self.BG_BRUSH
def onClick(index):
print 'clicked index: %s'%index
tableModel=Model()
tableView=QtGui.QTableView()
tableView.setModel(tableModel)
tableView.clicked.connect(onClick)
tableView.show()
app.exec_()
使用 QLineEdit 的调色板,我们可以指定 QGradient 作为它的背景颜色:
line = QtGui.QLineEdit()
palette = line.palette()
QRectF = QtCore.QRectF(line.rect())
gradient = QtGui.QLinearGradient(QRectF.topLeft(), QRectF.topRight())
palette.setBrush(QtGui.QPalette.Base, QtGui.QBrush(gradient))
line.setPalette(palette)
line.show()
在使用 QTableView
及其 QAbstractTableModel
时,我 return 从模型的 data
方法中为每个 BackgroundColorRole
请求提供了一个可靠的 QColor
。我宁愿为 tableView "item" 分配一个渐变,而不是纯色。
如何分配渐变而不是纯色?
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Model(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']]
def rowCount(self, parent=QtCore.QModelIndex()):
return 3
def columnCount(self, parent=QtCore.QModelIndex()):
return 3
def data(self, index, role):
if not index.isValid(): return
if role in [QtCore.Qt.DisplayRole, QtCore.Qt.EditRole]:
return self.items[index.row()][index.column()]
if role == QtCore.Qt.ForegroundRole:
return QtGui.QColor("white")
if role == QtCore.Qt.BackgroundColorRole:
return QtGui.QColor("gray")
def onClick(index):
print 'clicked index: %s'%index
tableModel=Model()
tableView=QtGui.QTableView()
tableView.setModel(tableModel)
tableView.clicked.connect(onClick)
tableView.show()
app.exec_()
中的BackgroundRole
用来生成一个QBrush
,可以有一个渐变。请参见下面的示例。 BackgroundColorRole
似乎已过时,因此最好使用 BackgroundRole
,即使您不想要渐变。
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
def create_gradient_brush():
horGradient = QtGui.QLinearGradient(0, 0, 100, 0)
verGradient = QtGui.QLinearGradient(0, 0, 0, 20)
gradient = verGradient
gradient.setColorAt(0.0, QtGui.QColor("blue"))
gradient.setColorAt(1.0, QtGui.QColor("red"))
brush = QtGui.QBrush(gradient)
return brush
class Model(QtCore.QAbstractTableModel):
# The cell size is most likely unavailable in the model, it could be
# different per view, so we make a cell size-independent gradient.
BG_BRUSH = create_gradient_brush()
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']]
def rowCount(self, parent=QtCore.QModelIndex()):
return 3
def columnCount(self, parent=QtCore.QModelIndex()):
return 3
def data(self, index, role):
if not index.isValid(): return
if role in [QtCore.Qt.DisplayRole, QtCore.Qt.EditRole]:
return self.items[index.row()][index.column()]
if role == QtCore.Qt.ForegroundRole:
return QtGui.QColor("white")
# BackgroundColorRole is obsolete, use BackgroundRole,
# which returns a QBrush.
if role == QtCore.Qt.BackgroundRole:
return self.BG_BRUSH
def onClick(index):
print 'clicked index: %s'%index
tableModel=Model()
tableView=QtGui.QTableView()
tableView.setModel(tableModel)
tableView.clicked.connect(onClick)
tableView.show()
app.exec_()