使用Qt交互式调整大小/拖动多个形状和图层

时间:2016-03-10 12:55:10

标签: c++ qt

我想创建一个GUI,其中用户先前选择的图像在背景中绘制,用户现在有几个选择区域和一些由一些点组成的折线(这些点在某个默认位置预先绘制) 。用户可以使用独占复选框设置其中一个激活(所选内容突出显示)。 用户应能够以典型方式调整大小并拖动它们(当鼠标位于形状中间时拖动,在边缘时调整大小并在角落时调整大小)。目的是用户在脸上标记某些区域(或者更确切地说是虹膜),眉毛,鼻子,嘴巴和下巴。

这是一个模型(背景图像未正确调整大小以适应布局大小): mockup of interactive resize/drag

这是一个带有小部件和QGroupbox的QHBoxLayout。小部件当前是一个自定义小部件,基本上有三个层(背景,非活动,活动),所有这些都是在paintEvent中结合使用的图像(与mousePress / Move / Release结合使用)。目前我可以重绘形状(折线除外,尚未实现),但不能重新调整大小和拖动。我有这样的感觉,虽然我没有这么做,并且我不确定我能达到我想要的样子,所以我的问题是:什么是一个好方法来做到这一点?

我已经读到GraphicsView很适合做这样的事情,但我对Qt缺乏经验。另外,将选择形状作为独立小部件更好吗?

目前在矩形的一角和我的鼠标实际位置之间画一个矩形时也有一些偏移,我无法弄清楚原因。

这是自定义小部件的标题:

class DrawMap : public QWidget
{
Q_OBJECT

public:
    DrawMap(QWidget *parent = 0);
    ~DrawMap();

    void setBackgroundImage(QImage bG);

private:
    bool mPressed;
    QPoint mInitial;
    QPoint mFinal;
    QPen pen;
    QList<QRect> seletionRects;
    QPoint chinContour[5];
    QImage *backgroundImage;
    QImage *inactiveImage;
    QImage *activeImage;
    int active;

    void drawRectangle();
    void drawRectangle(QPainter &painter, QRect *rect);
    void drawCircle();
    void drawCircle(QPainter &painter, QRect *rect);
    void drawChin(QPainter &painter);
    void fillInactiveImage();
    void fillActiveImage();

protected:
    void paintEvent(QPaintEvent *ev);
    void mousePressEvent(QMouseEvent *ev);
    void mouseReleaseEvent(QMouseEvent *ev);
    void mouseMoveEvent(QMouseEvent *ev);

public slots:
    void changeActive(int id);
};

如果这种东西有一些很好的资源也很好,我找不到合适的东西。

0 个答案:

没有答案