0

我想让用户用鼠标选择一个区域,就像你在任何地方都可以做的那样。为了更清楚,想象一下你在 Windows 上的桌面,然后单击左键并在按钮孔的情况下移动鼠标。将发生以下情况:您将看到鼠标经过的区域如何用矩形突出显示。这正是我想做的。

ps 数学上我知道如何计算,也知道如何通过在按下鼠标时跟踪鼠标位置来绘制矩形。

Q1:如何跟踪鼠标位置?Q2:有什么替代方法可以做我想做的事吗?

4

1 回答 1

4

最简单的方法是使用图形视图框架。它提供了项目选择机制、橡皮筋矩形的显示、橡皮筋与项目的交叉检测等。下面是一个自包含的例子。它允许您使用 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();
}
于 2013-08-30T17:12:48.243 回答