最近項目上有這樣一個需求,在圖片的指定位置添加按鈕,圖片隨着窗口的大小而改變,按鈕位置隨着圖片的大小改變而改變,具體圖片是這樣的:
需要在紅色的圓形區域添加按鈕,如果直接放在指定位置呢,窗口大小改變了,圖片的位置也就改變了,不能像佈局那樣隨着窗口的大小而改變,期間還參考了這個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