我想让用户用鼠标选择一个区域,就像你在任何地方都可以做的那样。为了更清楚,想象一下你在 Windows 上的桌面,然后单击左键并在按钮孔的情况下移动鼠标。将发生以下情况:您将看到鼠标经过的区域如何用矩形突出显示。这正是我想做的。
ps 数学上我知道如何计算,也知道如何通过在按下鼠标时跟踪鼠标位置来绘制矩形。
Q1:如何跟踪鼠标位置?Q2:有什么替代方法可以做我想做的事吗?
我想让用户用鼠标选择一个区域,就像你在任何地方都可以做的那样。为了更清楚,想象一下你在 Windows 上的桌面,然后单击左键并在按钮孔的情况下移动鼠标。将发生以下情况:您将看到鼠标经过的区域如何用矩形突出显示。这正是我想做的。
ps 数学上我知道如何计算,也知道如何通过在按下鼠标时跟踪鼠标位置来绘制矩形。
Q1:如何跟踪鼠标位置?Q2:有什么替代方法可以做我想做的事吗?
最简单的方法是使用图形视图框架。它提供了项目选择机制、橡皮筋矩形的显示、橡皮筋与项目的交叉检测等。下面是一个自包含的例子。它允许您使用 Ctrl/Cmd 单击切换选择或橡皮筋来选择和拖动多个项目。
OpenGL 用于渲染背景,您可以在其中放置任意 OpenGL 内容。
main.cpp
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QGLWidget>
static qreal rnd(qreal max) { return (qrand() / static_cast<qreal>(RAND_MAX)) * max; }
class View : public QGraphicsView {
public:
View(QGraphicsScene *scene, QWidget *parent = 0) : QGraphicsView(scene, parent) {
setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
}
void drawBackground(QPainter *, const QRectF &) {
QColor bg(Qt::blue);
glClearColor(bg.redF(), bg.greenF(), bg.blueF(), 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
};
void setupScene(QGraphicsScene &s)
{
for (int i = 0; i < 10; i++) {
qreal x = rnd(1), y = rnd(1);
QAbstractGraphicsShapeItem * item = new QGraphicsRectItem(x, y, rnd(1-x), rnd(1-y));
item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable);
item->setPen(QPen(Qt::red, 0));
item->setBrush(Qt::lightGray);
s.addItem(item);
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene s;
setupScene(s);
View v(&s);
v.fitInView(0, 0, 1, 1);
v.show();
v.setDragMode(QGraphicsView::RubberBandDrag);
v.setRenderHint(QPainter::Antialiasing);
return a.exec();
}