Exemplos do uso de QT [QT] escreveu um evento de rato de uma estrutura de rato arrasto e transformação de coordenadas

Exemplos do uso de QT escrever um evento de mouse de um treliça do mouse arraste e transformação de coordenadas

Criar um novo projeto com ui

Interface 1.ui

2. Adicione o arquivo de cabeçalho

#include <QDialog>
#include <QMouseEvent>

3. Adicione função e variáveis ​​declarações

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

4. Adicione função .cpp

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. Execute

Publicado 201 artigos originais · ganhou elogios 46 · vê 90000 +

Acho que você gosta

Origin blog.csdn.net/rong11417/article/details/104475786
Recomendado
Clasificación