【问题标题】:Mouse events QT鼠标事件 QT
【发布时间】:2013-08-31 01:39:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ qt mouse mouseevent mouse-position


    【解决方案1】:

    最简单的方法是使用图形视图框架。它提供了项目选择机制、橡皮筋矩形的显示、橡皮筋与项目的交叉检测等。下面是一个独立的例子。它允许您使用 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      相关资源
      最近更新 更多