其他推薦内容:
- qt電池控件設計:https://blog.csdn.net/weixin_42887343/article/details/113932145
- QWidget控件拖動:https://blog.csdn.net/weixin_42887343/article/details/114384324
- QWidget控件旋轉方法:https://blog.csdn.net/weixin_42887343/article/details/115037420
- qt柱狀圖控件設計:https://blog.csdn.net/weixin_42887343/article/details/115124178
- qt淡化提示框設計:https://blog.csdn.net/weixin_42887343/article/details/109303972
- qt之led(點陣)控件類設計:https://blog.csdn.net/weixin_42887343/article/details/115348953
說明:使用該類,可實作任意QWidget子類控件如下圖移動。
效果:

h檔案:
#ifndef MOVEWIDGET_H
#define MOVEWIDGET_H
#include <QWidget>
class MoveWidget : public QObject
{
Q_OBJECT
public:
explicit MoveWidget(QObject *parent = 0);
public Q_SLOTS:
void setLeftButton(bool leftButton); //設定是否限定滑鼠左鍵
void setInControl(bool inControl); //設定是否限定不能移出容器外面
void setWidget(QWidget *widget); //設定要移動的控件
protected:
bool eventFilter(QObject *watched, QEvent *event);
private:
QWidget *widget; //移動的控件
QPoint lastPoint; //最後按下的坐标
bool pressed; //滑鼠是否按下
bool leftButton; //限定滑鼠左鍵
bool inControl; //限定在容器内
};
#endif // MOVEWIDGET_H
cpp檔案:
#include "movewidget.h"
#include "qevent.h"
#include "qdebug.h"
MoveWidget::MoveWidget(QObject *parent) :
QObject(parent)
,lastPoint(QPoint(0, 0))
,pressed(false)
,leftButton(true)
,inControl(true)
,widget(false)
{
}
bool MoveWidget::eventFilter(QObject *watched, QEvent *event)
{
if (widget != 0 && watched == widget)
{
QMouseEvent *mouseEvent = (QMouseEvent *)event;
if (mouseEvent->type() == QEvent::MouseButtonPress)
{
//如果限定了隻能滑鼠左鍵拖動則判斷目前是否是滑鼠左鍵
if (leftButton && mouseEvent->button() != Qt::LeftButton)
return false;
//判斷控件的區域是否包含了目前滑鼠的坐标
if (widget->rect().contains(mouseEvent->pos()))
{
lastPoint = mouseEvent->pos();
pressed = true;
}
}
else if (mouseEvent->type() == QEvent::MouseMove && pressed)
{
//計算坐标偏移值,調用move函數移動過去
int offsetX = mouseEvent->pos().x() - lastPoint.x();
int offsetY = mouseEvent->pos().y() - lastPoint.y();
int x = widget->x() + offsetX;
int y = widget->y() + offsetY;
if (inControl)
{
//可以自行調整限定在容器中的範圍,這裡預設保留20個像素在裡面
int offset = 20;
bool xyOut = (x + widget->width() < offset || y + widget->height() < offset);
bool whOut = false;
QWidget *w = (QWidget *)widget->parent();
if (w != 0)
whOut = (w->width() - x < offset || w->height() - y < offset);
if (xyOut || whOut)
return false;
}
widget->move(x, y);
}
else if (mouseEvent->type() == QEvent::MouseButtonRelease && pressed)
pressed = false;
}
return QObject::eventFilter(watched, event);
}
void MoveWidget::setWidget(QWidget *widget)
{
if (this->widget == 0)
{
this->widget = widget;
this->widget->installEventFilter(this);
}
}
void MoveWidget::setLeftButton(bool leftButton)
{
this->leftButton = leftButton;
}
void MoveWidget::setInControl(bool inControl)
{
this->inControl = inControl;
}
使用方法:
設定
ui->pushButton
、
ui->pushButton_2
按鈕可移動,參數可以是任意
QWidget
子類。
MoveWidget *move = new MoveWidget(this);
move->setWidget(ui->pushButton);
MoveWidget *move2 = new MoveWidget(this);
move2->setWidget(ui->pushButton_2);