Beispiele für die Verwendung von QT [QT] schrieb ein Mausereignis eines Drag Gitter Maus und Koordinatentransformation

Beispiele für die Verwendung von QT ein Mausereignis eines Maus-drag Gitter schreiben und Koordinatentransformation

Erstellen Sie ein neues Projekt mit ui

1.ui Schnittstelle

2. die Header-Datei hinzufügen

#include <QDialog>
#include <QMouseEvent>

In Funktion und Variablendeklarationen 3.

private:
    void mousePressEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);
private:
    Ui::MouseDialog *ui;
    bool m_bDrag;//判断是否是左键选中
    QPoint m_ptPos;//记录鼠标和label相对位置

4. Funktion CPP hinzufügen

MouseDialog::MouseDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MouseDialog)
{
    ui->setupUi(this);
}

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

void MouseDialog::mousePressEvent(QMouseEvent *event){
    if(event->button() == Qt::LeftButton){
        //获取label矩形区域
        QRect rcBlock = ui->label->frameRect();
        //平移,让rcBlck和窗口坐标系一致
        rcBlock.translate(ui->label->pos());
        //判断鼠标点击的坐标是否在label区域内
        if(rcBlock.contains(event->pos()) == true){
            m_bDrag = true;
            //计算相对偏移量
            m_ptPos = ui->label->pos()-event->pos();
        }
    }
}
void MouseDialog::mouseReleaseEvent(QMouseEvent *event){
    if(event->button() == Qt::LeftButton){
        m_bDrag = false;
    }
}
void MouseDialog::mouseMoveEvent(QMouseEvent *event){
    if(m_bDrag){
        //计算新坐标
        QPoint ptPos = event->pos() + m_ptPos;
        //获取窗口大小
        QSize szClient = size();
        //获取label位置
        QRect rcBlock = ui->label->frameRect();
        //x坐标范围(0--(窗口x-label宽度))
        if(ptPos.x() < 0)
            ptPos.setX(0);
        else if(ptPos.x() >
                szClient.width()-rcBlock.width()){
            ptPos.setX(szClient.width()-rcBlock.width());
        }
        //y坐标范围(0--(窗口y-label高度))
        if(ptPos.y() < 0)
            ptPos.setY(0);
        else if(ptPos.y() >
                szClient.height()-rcBlock.height()){
            ptPos.setY(szClient.height()-rcBlock.height());
        }

        //移动到新的位置
        ui->label->move(ptPos);
    }
}

5. Führen Sie

Veröffentlicht 201 Originalarbeiten · erntete Lob 46 · Ansichten 90000 +

Ich denke du magst

Origin blog.csdn.net/rong11417/article/details/104475786
Empfohlen
Rangfolge