繁体   English   中英

Qt麻烦与绘画选择框

[英]Qt Troubles with painting selection box

我在强制重新粉刷/更新Qt窗口小部件时遇到麻烦(它扩展了QGraphicsView类)。 我要绘制一个矩形选择框,当用户按下并移动鼠标时,该框将突出显示目标选择区域。

基本工作流程:

  1. MousePressEvent设置making_selection_box标志,并存储起点(工作中)。
  2. MouseMoveEvent检查是否需要更新显示。 如果这样做,它将尝试这样做(不起作用)。
  3. MouseReleaseEvent句柄获取结果选择框并进行相应的处理。 making_selection_box被重置。 屏幕应该更新以删除选择框工件(不起作用)。

重写的mouseMoveEvent:

void QSchematic::mouseMoveEvent(QMouseEvent *event)
{
    if(making_selection_box)
    {
        // get selection box
        qDebug() << "updating selection box";
        curr_selection_end = event->pos();
        repaint(box(drag_select_start, curr_selection_end));
    }
    // propogate event
    QGraphicsView::mouseMoveEvent(event);
}

我重写的paintEvent:

void QSchematic::paintEvent(QPaintEvent *event)
{
    qDebug() << "paintEvent";
    if(making_selection_box)
    {
        qDebug() << "drawing selection box";
        QPainter painter(viewport());
        painter.setPen(Qt::black);
        painter.drawRect(box(drag_select_start, curr_selection_end));
        painter.end();
    }
    // propogate event
    QGraphicsView::paintEvent(event);
}

Box只是我编写的一个小辅助函数,用于为不同的选择框起点/终点创建正确的QRect。

static QRect box(const QPoint& p1, const QPoint &p2)
{
    int min_x = p1.x();
    int min_y = p1.y();
    int max_x = p2.x();
    int max_y = p2.y();
    if(max_x < min_x)
    {
        max_x = min_x;
        min_x = p2.x();
    }
    if(max_y < min_x)
    {
        max_y = min_y;
        min_y = p2.y();
    }
    return QRect(min_x, min_y, max_x - min_x, max_y - min_y);
}

我已验证当用户按下按钮并四处移动鼠标时,可以正确触发mouseMoveEvent。

我还验证了在执行各种标准操作(例如调整窗口大小,最小化/最大化窗口等)时,系统正在调用paintEvent。

我已经验证了我用来绘制小部件的方法可以与其他paintEvent触发器一起正常使用,但我只是无法设法在代码中触发重绘。

我也尝试通过使用update()方法而不是repaint()来强制更新,但是没有运气。

作为附带说明,我要以错误/困难的方式创建此选择框功能吗? 是否有更好的方法来获得选择框,而无需手动实现鼠标侦听器和绘画代码?

我正在使用Visual Studio 2010 MSVC编译器在Windows 7 x64上使用Qt 4.8.4进行测试。

在浏览完QGraphicsScene API之后,我发现了一种手动解决选择框的简单方法:拖动模式需要设置为RubberBandDrag

编辑:

为了进一步扩展我的答案(允许在QGraphicsView上作其他用途的绘制),需要接收更新/重绘的是视口,而不是我的QGraphicsView对象。

void QSchematic::mouseMoveEvent(QMouseEvent *event)
{
    if(making_selection_box)
    {
        // get selection box
        qDebug() << "updating selection box";
        curr_selection_end = event->pos();
        viewport()->repaint(box(drag_select_start, curr_selection_end));
    }
    // propogate event
    QGraphicsView::mouseMoveEvent(event);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM