• 7190阅读
  • 4回复

[提问]如何画出按下鼠标左键并拖动时的矩形框 [复制链接]

上一主题 下一主题
离线yzpdsg
 

只看楼主 倒序阅读 楼主  发表于: 2013-03-27
我想在一幅图片中通过画矩形框进行标记,因此重写了和鼠标事件有关的函数:



void MainWindow::mouseMoveEvent(QMouseEvent *)
{
    QApplication::setOverrideCursor(Qt::CrossCursor);
    status->setText(QString::number(mapFromGlobal(QCursor::pos()).x()) +
                    "," +
                    QString::number(mapFromGlobal(QCursor::pos()).y()));
}


void MainWindow::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::LeftButton){   //鼠标左键按下
        startPoint.setX(e->pos().x() -
                        ui->label->geometry().topLeft().x() +
                        ui->label->mapFrom(this,ui->label->geometry().topLeft()).x());
        startPoint.setY(e->pos().y() -
                        ui->label->geometry().topLeft().y() +
                        ui->label->mapFrom(this,ui->label->geometry().topLeft()).y());
        qDebug()<<"startPoint="<<startPoint;
    }
}


void MainWindow::mouseReleaseEvent(QMouseEvent *e)
{
    if(e->button() == Qt::LeftButton){   //鼠标左键释放
        endPoint.setX(e->pos().x() -
                      ui->label->geometry().topLeft().x() +
                      ui->label->mapFrom(this,ui->label->geometry().topLeft()).x());
        endPoint.setY(e->pos().y() -
                      ui->label->geometry().topLeft().y() +
                      ui->label->mapFrom(this,ui->label->geometry().topLeft()).y());
        qDebug()<<"endPoint="<<endPoint;
        drawSomething(startPoint,endPoint); //画一个矩形
        update();
    }
}


这样虽然能达到目的,但是按下鼠标左键拖动时不显示矩形框。
离线hehuim

只看该作者 1楼 发表于: 2013-03-27
mouseMoveEvent中要捕捉到鼠标瞬间移动时的点,然后在paintEvent中画出来!刚才说错了!见谅!
离线jdwx

只看该作者 2楼 发表于: 2013-03-27
回 楼主(yzpdsg) 的帖子
Qt的画图有些特别,画图的代码必须写在paintEvent里,
可以这么办,鼠标放下(QPoint储存鼠标位置,bool储存鼠标状态),鼠标移动(再用一个QPoint储存鼠标位置,同时update()),paintEvent里检测鼠标状态(bool变量),if鼠标按下,把两个QPoint合成矩形,画出来。
大概就这些。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线yzpdsg

只看该作者 3楼 发表于: 2013-03-27
回 2楼(jdwx) 的帖子
谢谢。我试了一下,结果画出来的矩形是实心的。怎么擦掉上一次画的东西呢?
离线jdwx

只看该作者 4楼 发表于: 2013-03-27
回 3楼(yzpdsg) 的帖子
鼠标移动一下,就会全部擦除重绘,只会有一个空心的方框。
是不是用到了QBrush,给填充了。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
快速回复
限100 字节
 
上一个 下一个