我想为QTableView设置背景图像。
在函数内部,我创建了一个测试QWidget并应用了图像,它可以完美地工作。我传入的fp_widget是QTableView,问题就来了。该图像未显示/未应用于QTableView。
void setBackgroundImage(QWidget *fp_widget, const QPixmap &image)
{
QPalette palette;
palette.setBrush(QPalette::Background, image);
fp_widget->setPalette(palette);
QWidget *test = new QWidget;
test->setPalette(palette);
test->resize(800,800);
test->show();
}
如果您可以将表格视图放在小部件内,则值得尝试。在下面的示例中,我在设计器中进行了此操作,并为背景小部件提供了一个网格布局,其所有边距均设置为0,以便表格视图完全与背景小部件重叠。
首先,设置表视图viewport背景透明(使用CSS):
ui->tableView->viewport()->setStyleSheet("background: transparent");
然后,您必须在其绘画事件中的背景小部件中绘制QPixmap
。您可以自己(子类)专门设置QWidget
并重新实现该事件,或使用如下事件过滤器:
bool Widget::eventFilter(QObject *obj, QEvent *e)
{
if (e->type() == QEvent::Paint)
{
QPainter p(ui->bgWidget);
p.drawPixmap(0, 0, _p->scaled(ui->bgWidget->size()));
return true;
}
return false;
}
[注意,我使用_p
指向QPixmap
的指针,这是我的顶层小部件的私有成员(在构造函数中,我从文件中加载了测试图片)。另外,我只是压缩像素图以适合背景大小。
过滤器必须安装在后台小部件(bgWidget
)中,我再次在顶级小部件构造函数中执行此操作:
ui->bgWidget->installEventFilter(this);