Qt在QLabel显示图片并绘制矩形框,并且能够拖动
时间: 2024-05-07 19:19:10 浏览: 12
可以通过继承QLabel类来实现这个功能,具体实现步骤如下:
1. 在派生类中定义一个QPixmap类型的变量,用于存储图片。
2. 重载paintEvent函数,将图片绘制到QLabel中。
3. 重载mousePressEvent、mouseMoveEvent、mouseReleaseEvent函数,实现矩形框的绘制与拖动操作。
下面是一个简单的实现示例:
```
class ImageLabel : public QLabel
{
Q_OBJECT
public:
ImageLabel(QWidget *parent = nullptr);
void setImage(const QPixmap &pixmap);
protected:
void paintEvent(QPaintEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
private:
QPixmap m_pixmap;
QRect m_rect;
bool m_isDrawing;
};
ImageLabel::ImageLabel(QWidget *parent)
: QLabel(parent), m_isDrawing(false)
{
setMouseTracking(true);
}
void ImageLabel::setImage(const QPixmap &pixmap)
{
m_pixmap = pixmap;
m_rect = QRect();
update();
}
void ImageLabel::paintEvent(QPaintEvent *event)
{
QLabel::paintEvent(event);
if (!m_pixmap.isNull()) {
QPainter painter(this);
painter.drawPixmap(rect(), m_pixmap);
if (!m_rect.isNull()) {
painter.setPen(QPen(Qt::red, 2));
painter.drawRect(m_rect);
}
}
}
void ImageLabel::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_rect.setTopLeft(event->pos());
m_rect.setWidth(0);
m_rect.setHeight(0);
m_isDrawing = true;
}
}
void ImageLabel::mouseMoveEvent(QMouseEvent *event)
{
if (m_isDrawing) {
m_rect.setBottomRight(event->pos());
update();
}
}
void ImageLabel::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_isDrawing = false;
}
}
```
在使用时,只需要将图片设置到ImageLabel中即可:
```
ImageLabel *label = new ImageLabel(this);
QPixmap pixmap("image.png");
label->setImage(pixmap);
```
这样就可以在QLabel中显示图片并绘制矩形框,并且能够拖动了。