最近项目上有这样一个需求,在图片的指定位置添加按钮,图片随着窗口的大小而改变,按钮位置随着图片的大小改变而改变,具体图片是这样的:
需要在红色的圆形区域添加按钮,如果直接放在指定位置呢,窗口大小改变了,图片的位置也就改变了,不能像布局那样随着窗口的大小而改变,期间还参考了这个http://stevenshi.me/2017/05/09/qt-widget-designated-location/,没有达到我要的效果.最终在群里大佬的指点下,整理了出来,最终效果:
思路就是重写resizeEvent,直接贴上代码:
#ifndef TCS_H
#define TCS_H
#include <QWidget>
#include <QPixmap>
#include <QPushButton>
#include <QRect>
#include <QMap>
#include <QResizeEvent>
#include <QPaintEvent>
namespace Ui {
class TCS;
}
class TCS : public QWidget
{
Q_OBJECT
public:
explicit TCS(QWidget *parent = 0);
~TCS();
protected:
void resizeEvent(QResizeEvent *ev);
void paintEvent(QPaintEvent *e);
private:
Ui::TCS *ui;
QPixmap m_bg;
QMap <QAbstractButton*,QRect> m_btns;
};
#endif // TCS_H
#include "tcs.h"
#include "ui_tcs.h"
#include <QPainter>
TCS::TCS(QWidget *parent) :
QWidget(parent),
ui(new Ui::TCS)
{
ui->setupUi(this);
m_bg = QPixmap(":/new/prefix1/image/tcs/tcs.png");
foreach (auto btn, ui->buttonGroup->buttons()) {
m_btns[btn] = btn->geometry();
}
}
TCS::~TCS()
{
delete ui;
}
void TCS::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
painter.drawPixmap(rect(),m_bg);
}
void TCS::resizeEvent(QResizeEvent *ev)
{
QWidget::resizeEvent(ev);
QMatrix m;
m.scale(ev->size().width()*1.0/m_bg.width(),
ev->size().height()*1.0/m_bg.height());
foreach (auto btn, m_btns.keys()) {
btn->setGeometry(m.mapRect(m_btns[btn]));
}
}
下载地址:https://download.csdn.net/download/yu_20501253/11380320