功能:QT 实现框选
QT 通过鼠标拖动实现框选
实现移动鼠标时,能够进行框选。需要三个鼠标事件,一个画图事件,用来画长方形
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
画长方形需要记住左上角的点和长,宽,利用链表来记录点。当鼠标按下时,记录下第一个点,而当鼠标移动时,记录如果链表中只有一个点则将新的点加入,如果链表中已经有两个点了,需要将链表中的第二个点删除,将最新的点进行添加。
void Widget::mousePressEvent(QMouseEvent *event)
{
if (m_dh_video != NULL) {
appendPoints(event->pos());
printf("mousePressEvent \n");
}
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if (m_dh_video != NULL) {
append(event->pos());
update();
}
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
append(event->pos());
update(); // 启动paintEvent
// mouseReleaseAndControl(); // 在鼠标释放后调用快速定位的功能
drawParamList.clear();
}
void Widget::draw(QPainter& painter, QList<QPoint>& param)
{
if (param.count() >= 2) {
int x = (param[0].x() < param[1].x()) ? param[0].x() : param[1].x();
int y = (param[0].y() < param[1].y()) ? param[0].y() : param[1].y();
int w = qAbs(param[0].x() - param[1].x()) + 1;
int h = qAbs(param[0].y() - param[1].y()) + 1;
painter.drawRect(x, y, w, h); // 画长方形
}
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(Qt::blue);
draw(painter, drawParamList); //
}
void Widget::appendPoints(QPoint p)
{
if ( drawParamList.count() == 2 ) {
drawParamList.removeLast(); // 移除最后一个点
}
drawParamList.append(p);
}