gpt4 book ai didi

c++ - Qt绘画选择框的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:29:26 25 4
gpt4 key购买 nike

我在强制重绘/更新我的 Qt Widget 时遇到了麻烦(它扩展了 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 上绘画用于其他目的的答案,需要接收更新/重绘的是视口(viewport),而不是我的 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);
}

关于c++ - Qt绘画选择框的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14167785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com