[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;
}

[Qt]拖拽图片

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

#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();
move(pos().x() + dx, pos().y() + dy);
}
}

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);

QPixmap pixmap(“/home/orangepi/11111.jpg”);
/*
ui->label->setPixmap(pixmap);

ui->label->setGeometry(50, 50, pixmap.width(), pixmap.height());

ui->label->setObjectName(“draggableLabel”);
*/

DraggableLabel *label2 = new DraggableLabel(this);

label2->setPixmap(pixmap);

label2->setGeometry(50, 50, pixmap.width(), pixmap.height());

}

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

[Qt]创建线程

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

#include

#include
#include
#include
#include
#include

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class Work1 ;
class Work2 ;

class MainWindow : public QMainWindow
{
Q_OBJECT

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

private:
Ui::MainWindow *ui;

private:
Work1 *worker1;
Work2 *worker2;

QThread workerThread1;
QThread workerThread2;
};

class Work1:public QObject
{
Q_OBJECT
bool isCanRun;
public slots:
void doWork1(void)
{
isCanRun = true;
while (1)
{
if (!isCanRun)
{
break;
}
QThread::sleep(2);
qDebug() << "Work1"; } } signals: void resultemit1(); public : void stopWork() { qDebug()<< "break thread"<setupUi(this);

worker1 = new Work1;
worker2 = new Work2;

worker1->moveToThread(&workerThread1);
worker2->moveToThread(&workerThread2);

QObject::connect(&workerThread1, &QThread::started, worker1, &Work1::doWork1);
QObject::connect(&workerThread2, &QThread::started, worker2, &Work2::doWork2);

workerThread1.start();
workerThread2.start();

connect(&workerThread1, SIGNAL(finished()),worker1, SLOT(deleteLater()));
connect(&workerThread1, SIGNAL(finished()),&workerThread1, SLOT(deleteLater()));

connect(&workerThread2, SIGNAL(finished()),worker2, SLOT(deleteLater()));
connect(&workerThread2, SIGNAL(finished()),&workerThread2, SLOT(deleteLater()));
}

MainWindow::~MainWindow()
{
delete ui;

worker1->stopWork();
worker2->stopWork();
workerThread1.quit();
workerThread2.quit();

if (workerThread1.wait(5000)) {
qDebug()<<"thread end"<