Qt QPainter drawPixmap 画double类型矩形(QRectF)

使用QPainter绘制QImage到QPixmap
这段代码展示了如何利用QPainter的drawPixmap方法,将一个QImage对象转换为QPixmap,并绘制到指定的矩形区域(x,y,w,h)。QPixmap::fromImage函数用于创建QPixmap实例。
QPainter painter;
QImage image;
painter.drawPixmap(QRectF(x,y,w,h),QPixmap::fromImage(image),QRectF());
#include <QSlider> #include <QStyleOptionSlider> #include <QPainter> #include <QStyle> class NewHSlider : public QSlider { Q_OBJECT public: NewHSlider(QWidget *parent = nullptr) : QSlider(Qt::Horizontal, parent) { setAttribute(Qt::WA_NoSystemBackground); //setRange(-12, 12); //setFixedHeight(30); // 推荐高度 //setValue(0); connect(this, &QSlider::valueChanged, this, [this]() { update(); }); } protected: void paintEvent(QPaintEvent *event) override { Q_UNUSED(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, false); // 提前加载并缩放图片到固定高度 10px static const QPixmap emptyPixmap = QPixmap(":/Resources/Skin/Images/Slider/empty.png") .scaled(1, 8, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); static const QPixmap fullPixmap = QPixmap(":/Resources/Skin/Images/Slider/full2.png") .scaled(1, 8, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); if (emptyPixmap.isNull() || fullPixmap.isNull()) { return; } const int sliderMin = style()->pixelMetric(QStyle::PM_SliderTickmarkOffset, nullptr, this); const int sliderMax = width() - sliderMin; const double range = maximum() - minimum(); // 总范围 const double scale = static_cast<double>(sliderMax - sliderMin) / range; const int centerPos = sliderMin + (0 - minimum()) * scale; // 0值对应的位置 const int currentPos = sliderMin + (value() - minimum()) * scale; // 当前值位置 // 固定滑轨高度为 10px const int trackHeight = 8; const int y = (height() - trackHeight) / 2; // 垂直居中 const int trackWidth = sliderMax - sliderMin; // === 修改点1: 绘制背景图片(只在左端绘制一次,不平铺)=== // 如果你只是想在左侧一张图表示空状态,比如从 sliderMin 开始一次 emptyPixmap //painter.drawPixmap(sliderMin, y, emptyPixmap); // 只一次! QRectF backgroundRect(sliderMin, y, trackWidth, trackHeight); painter.drawTiledPixmap(backgroundRect, emptyPixmap); // 自动重复平铺 /* // === 修改点2: 绘制已填充部分(只一次 fullPixmap,不平铺)=== if (value() != 0) { if (value() < 0) { int w = centerPos - currentPos; // 计算需要绘制多少个 8px 宽度的 tile(可选:拉伸 or 多次 drawPixmap) // 但你现在要求“只显示一次”,那就只一个 painter.drawPixmap(currentPos, y, fullPixmap); // 只一次 } else { // value > 0 painter.drawPixmap(centerPos, y, fullPixmap); // 在 centerPos 处一次 } }*/ // === 绘制已填充部分(从 center 到 current)=== if (value() != 0) { QRect fillRect; if (value() < 0) { int w = centerPos - currentPos; fillRect = QRect(currentPos, y, w, trackHeight); } else { int w = currentPos - centerPos; fillRect = QRect(centerPos, y, w, trackHeight); } painter.drawTiledPixmap(fillRect, fullPixmap); } // === 绘制滑块手柄(Handle)=== QStyleOptionSlider opt; initStyleOption(&opt); opt.subControls = QStyle::SC_SliderHandle; opt.sliderPosition = value(); opt.sliderValue = value(); style()->drawComplexControl(QStyle::CC_Slider, &opt, &painter, this); } }; 设置QSlider的四周为圆弧
最新发布
11-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值