窗体设置可自由缩放的图片背景
Qt C++中可以采用如下方法为窗体(QWidget )设置一个可以跟随窗体大小自由缩放的背景图片,而且为窗体添加了一个标题,该标题同样也跟随窗体大小自由缩放(而不是类似平铺的效果)
核心代码在与重写绘制事件paintEvent()。
代码
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPixmap>
#include <QFontMetrics>
class CustomWidget : public QWidget
{
public:
CustomWidget(QWidget *parent = nullptr) : QWidget(parent)
{
// 重置窗体大小
resize(900,600);
// 创建临时的 QPixmap 用于绘制背景图片和标题
tempPixmap = QPixmap (size());
tempPixmap.fill(Qt::transparent);
QPainter painter(&tempPixmap);
// 加载背景图片
QPixmap backgroundPixmap(":/images/background.png");
// 绘制背景图片,使其按照窗体大小进行缩放
painter.drawPixmap(rect(), backgroundPixmap.scaled(size()));
// 随窗体大小变化自动调整标题大小
QFont titleFont = painter.font();
int titleFontSize = 36;
titleFont.setPointSize(titleFontSize);
painter.setFont(titleFont);
QString titel = "窗口标题";
// 获取标题文本的宽度
QFontMetrics fm(titleFont);
int titleWidth = fm.horizontalAdvance(titel );
// 设置标题文本绘制位置,使其水平居中
int titleX = (width() - titleWidth) / 2;
int titleY = height() / 10;
// 绘制标题文本
painter.setPen(Qt::white);
painter.drawText(titleX, titleY, titel );
}
// 设置一个临时Pixmap对象用于将背景图片和标题文本组合起来
QPixmap tempPixmap;
protected:
void paintEvent(QPaintEvent *event) override
{
Q_UNUSED(event);
// 将绘制好的 QPixmap 设置为窗体的背景
QPainter windowPainter(this);
windowPainter.drawPixmap(rect(), tempPixmap);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
CustomWidget window;
window.show();
return app.exec();
}
运行效果
- 缩放前
- 缩放后(背景图片和标题的长宽比发生了明显变化)