[Qt]拖拽图片,限制在子窗口内

————————————mainwindow.h————————————
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include

#include
#include
#include
#include

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
Ui::MainWindow *ui;
};

class DraggableLabel : public QLabel
{
Q_OBJECT

public:
explicit DraggableLabel(QWidget *parent = nullptr) : QLabel(parent), isDragging(false) {}

protected:
void mousePressEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton) {
isDragging = true;
dragStartPosition = event->pos();
}
}

void mouseMoveEvent(QMouseEvent *event) override
{
if (isDragging) {
int dx = event->pos().x() – dragStartPosition.x();
int dy = event->pos().y() – dragStartPosition.y();

// 获取父窗口尺寸
QWidget *parentWidget = this->parentWidget();

// 计算新位置,确保不会超出父窗口边界
int newX = qMax(0, qMin(this->pos().x() + dx, parentWidget->width() – this->width()));
int newY = qMax(0, qMin(this->pos().y() + dy, parentWidget->height() – this->height()));

// 移动到新的位置
move(newX, newY);
}
}

void mouseReleaseEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton) {
isDragging = false;
}
}

private:
bool isDragging;
QPoint dragStartPosition;
};

#endif // MAINWINDOW_H

————————————mainwindow.cpp——————————————————-
#include “mainwindow.h”
#include “ui_mainwindow.h”

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);

QWidget *subWindow = new QWidget(this);
subWindow->setGeometry(50, 50, 1500, 800); // 设置子窗口的位置和大小
subWindow->setStyleSheet(“background-color: lightgray;”); // 设置子窗口背景色

// 创建并设置图片
QPixmap pixmap(“/home/yue/11111.jpg”);
DraggableLabel *label = new DraggableLabel(subWindow);
label->setPixmap(pixmap);
label->setGeometry(10, 10, pixmap.width(), pixmap.height()); // 设置初始位置和大小

}

MainWindow::~MainWindow()
{
delete ui;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注