实现功能:Label上有一张图片,用画笔在图像上画线。
一、头文件添加以下函数和变量
QMouseEvent * mouseEvent;
void mousePressEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
void paintEvent(QPaintEvent *p);
void posTrans(QPoint);//坐标转换
QVector<QPoint> line;
二、源文件中实现以上函数
void Widget::paintEvent(QPaintEvent *event)//任何鼠标事件都会导致调用paintevent
{
QPainter pen(&pix);//画笔设置在图像pix上,表示在图像中画线
for (int i = 0;i<line.size()-1;i++)
{
pen.drawLine(line[i],line[i+1]);
}
ui->label->setPixmap(pix);
}
void Widget::mouseMoveEvent(QMouseEvent *event)//鼠标按下之后,移动事件才能触发
{
posTrans(event->globalPos());//获取全局坐标
}
void Widget::mousePressEvent(QMouseEvent *event)
{
posTrans(event->globalPos());
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
posTrans(event->globalPos());
line.clear();//画完一条线之后清楚vector内容,便于下次装新的线
}
void Widget::posTrans(QPoint p)
{
QPoint p0 = ui->label->mapFromGlobal(p);//图片填满label时可用
//当图片未填满label时
int xoffset = (ui->label->contentsRect().width()-ui->label->pixmap()->width())/2;
int yoffset = (ui->label->contentsRect().height()-ui->label->pixmap()->height())/2;
QPoint Pos0 = QPoint(p0.x()-xoffset,p0.y()-yoffset);
line.push_back(Pos0);
}
三、效果