Search code examples
c++qtqt4qtablewidgetqtablewidgetitem

How to set a "plain" or "flat" background color for a QTableWidgetItem


I have a QTableWidget. I want to have alternating background colors for the rows, but I can't use QTableWidget::setAlternatingRowColors because I need one color for two rows and the other one for the next two and so on (see the below image).

Thus, when I add a QTableWidgetItem, I set the according background color manually by QTableWidgetItem::setBackground().

But I don't get a "flat" or "plain" background by this, but a gradient and rounded corners:

Cell color

I would like to have the background color all over the cells, without further "decoration". How can I get rid of this?


Solution

  • When you select a single color as the background (QBrush constructed from a QColor), the style engine tries to render a styled background, which in your case draws this gradient with border.

    You can trick the style engine by using a QBrush constructed from a QImage, so the render engine draws exactly that image and nothing more. In your case, use an image with a single pixel, namely the color you want as the background. For this, construct a 1x1-sized QImage and set the color of the pixel using fill, then use that image as a brush:

    // Create the image (using the default image format)
    QImage img(QSize(1, 1), QImage::Format_ARGB32_Premultiplied);
    
    // Set the color, here light gray:
    img.fill(QColor(224, 224, 224));
    
    // Apply the image as the background for the item:
    item->setBackground(QBrush(img));