[英]Qt Troubles with painting selection box
我在强制重新粉刷/更新Qt窗口小部件时遇到麻烦(它扩展了QGraphicsView
类)。 我要绘制一个矩形选择框,当用户按下并移动鼠标时,该框将突出显示目标选择区域。
基本工作流程:
making_selection_box
标志,并存储起点(工作中)。 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.