用QPixmap填充QWidget的有效方法

Efficient Way to Fill QWidget With QPixmap

本文关键字:有效 方法 QWidget QPixmap 填充      更新时间:2023-10-16

我正在尝试使用它,以便用户可以使用从文件加载的自己的QPixmap手动设置QWidget的背景。我的目标是用QPixmap填充QWidget,按比例缩放以填充整个QWidget(即,只要填充了整个QWidget,部分QPixmap就可以被边缘切掉)。所以,我不能使用QBrush来绘制像素图,因为我不想要平铺。

目前,我有两个成员pixmap对象:m_backgroundPixmapm_scaledBackgroundPixmap。在每个resizeEvent上,我取m_backgroundPixmap,将其缩放到适合QWidget的正确尺寸,然后将其保存为m_scaledBackgroundPixmap。在我的paintEvent中,我简单地使用QPainter::drawPixmap来绘制缩放的像素图。

还有其他更有效的方法吗?我宁愿不必在每个resizeEvent上调整像素图的大小,特别是如果resizeEvent导致窗口边缘拉伸,这意味着它将连续获得许多这样的事件。

您可以使用Qt样式表从文件加载背景图像。

myWidget->setObjectName("myWidget");
QString fileName = QFileDialog::getOpenFileName(this,
    tr("Open Image"), "/home", tr("Image Files (*.png *.jpg *.bmp)"));
myWidget->setStyleSheet("#myWidget {border-image: url("+fileName+")}");

此外,将CSS样式应用于从QWidget继承的自定义小部件需要以这种方式重新实现paintEvent()

void MyWidget::paintEvent(QPaintEvent *)
{
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}