How can I change QTableView's color of the area that doesn't have cells on it?
-
I think you misunterstood what Andre meant.
bq. Instead, why not just create a pair of getters and setter methods for the colors on the proxy model.
A pair of getters/setters would be :
@
void MyProxyModel::setAlternateColor1(const QColor &color)
{
mAlternateColor1 = color;
}QColor MyProxyModel::alternateColor1() const
{
return mAlternateColor1;
}
@ -
Octal:
Indeed, that's what I meant, and also a getter and a setter for the primary color. You can set them at initialization of your proxy model, which is very likely to be in the constructor of a widget class. Hence, you have cheap access to a widget pointer and the palette there, and you only need that access once. -
I've created setters and getters. Now I use the proxy like that:
@
proxyModel = new MyProxyModel;
QColor altColor1 = this->palette().color(QPalette::Base);
QColor altColor2 = this->palette().color(QPalette::AlternateBase);
proxyModel->setAlternateColor1(altColor1);
proxyModel->setAlternateColor2(altColor2);
proxyModel->setSourceModel(model);
@proxyModel's data() method calls the getters.
Is it better like that?Andre, what do you mean with primary color?
-
As long as you use the colors you set there in your data() method: much better :-)
One small tip: you will want to give your MyProxyModel object a parent object. Seeing that this proxy is really doing presentation work, I suggest you use the view that it is for as the parent object. Also: a more descriptive name than "MyProxyModel" would probably work better in the long run.
-
I've called it PresentationProxyModel :-)
Thanks a lot for the help. -
The presentation details should normally be handled by the delegates, for example:
@class AlternateBackgroundColorDelegate : public QStyledItemDelegate {
QColor colors[2];
public:
AlternateBackgroundColorDelegate(const QColor & color1,
const QColor & color2,
QObject *parent = 0)
: QStyledItemDelegate(parent)
{
colors[0] = color1;
colors[1] = color2;
}
void initStyleOption(QStyleOptionViewItem *option,
const QModelIndex &index) const
{
QStyledItemDelegate::initStyleOption(option, index);QStyleOptionViewItemV4 *optionV4 = qstyleoption_cast<QStyleOptionViewItemV4*>(option); // If the brush hasn't explicitly been set in the model if (optionV4->backgroundBrush.style() == Qt::NoBrush) optionV4->backgroundBrush = QBrush(colors[index.row()%2]); }
};
// And you use it like this:
tableView->setItemDelegate(
new AlternateBackgroundColorDelegate(Qt::blue, Qt::red, tableView));
@
Or using a different palette for the items and the view:
@class ChangePaletteDelegate : public QStyledItemDelegate {
QPalette palette;
public:
ChangePaletteDelegate(const QPalette &palette,
QObject *parent = 0)
: QStyledItemDelegate(parent), palette(palette)
{
}
void initStyleOption(QStyleOptionViewItem *option,
const QModelIndex &index) const
{
QStyledItemDelegate::initStyleOption(option, index);
option.palette = palette;
// Edit: the palette isn't used for background color if QPalette::Base is set
QStyleOptionViewItemV4 optionV4 =
qstyleoption_cast<QStyleOptionViewItemV4>(option);
// If the brush has explicitly been set in the model, do nothing
if (optionV4->backgroundBrush.style() != Qt::NoBrush)
return;if(optionV4->features & oQStyleOptionViewItemV2::Alternate) { optionV4->backgroundBrush = palette.brush(QPalette::AlternateBase); } else { optionV4->backgroundBrush = palette.brush(QPalette::Base); } }
};
// And you use it like this:
QPalette palette = tableView->palette();
// Use the original palette here, for the items
tableView->setItemDelegate(new ChangePaletteDelegate(palette, tableView));
// and change the background for the view
palette.setColor(QPalette::Base, Qt::yellow);
tableView->setPalette(palette);@
Edit Fixed ChangePaletteDelegate.
-
alexisdm, l like your way for solving this problem.
The palette method doesn't work for me. -
The palette method only works if you don't use stylesheets at the same time, I think.
-
I don't use stylesheets. With ChangePaletteDelegate I have the cells and the outside area of the cells yellow (other color for the alternating row color);
-
Sorry, I fixed it. It was only working if the QPalette::Base wasn't set explicitly.
The alternate row background is painted directly by the view, and not by the delegate as I thought.
So in both methods, QStyleOptionViewItemV4::backgroundBrush must be used to change the background color. -
It's a really old topic, but still usable so: for the empty space below the cells you can use the viewport:
tableWidget->viewport()->setStyleSheet("background-color: #888;");