天天看點

QWidget控件拖動設計類

其他推薦内容:

  • 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子類控件如下圖移動。

效果:

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

繼續閱讀