按Shift键时完全垂直/水平直线(C ++和Qt 5.8)

时间:2017-11-02 04:20:04

标签: c++ qt

当我在一个名为EasyPaint的程序中按下shift键时,我正在执行一项完成直线垂直/水平线的任务。我的代码中没有错误,但不幸的是,它对程序本身也没有任何影响。当我画一条线并按下shift时,它绝对没有。下面的代码是我的方法shiftPressEvent和我的另一个方法isMod。我尝试计算度数来尝试指定线应该捕捉到垂直对齐或水平对齐的时间,但显然,它似乎没有完成预期的工作。如果另一组眼睛可以分析代码并查看问题所在,我非常感激。此外,如果需要任何进一步的信息,请在下面评论。我可以轻松发布整个LineInstrument类,但它有点冗长。

在编辑之前在LineInstrument.cpp中添加了方法

void LineInstrument::shiftPressEvent(QKeyEvent *event, ImageArea &imageArea){
if (imageArea.isPaint())
{
    imageArea.setImage(mImageCopy);
    double Y = mStartPoint.y() - mEndPoint.y();
    double X = mStartPoint.x() - mEndPoint.x();

    radianAngle = atan2(Y, X);
    degreeAngle = radianAngle * 180 / atan(1) * 4;

    if (isMod(event->key()))
    {
        if (abs(degreeAngle) >= 45 && abs(degreeAngle) <= 135)
        {
            mEndPoint.setX(mStartPoint.x());
        }

        else if (abs(degreeAngle) < 45 && abs(degreeAngle) > 135)
        {
            mEndPoint.setY(mStartPoint.y());
        }

        imageArea.update();
    }
}
}

bool LineInstrument::isMod(int key){
if (key == Qt::Key_Shift)
{
    return true;
}

return false;
}

在编辑后的LineInstrument.cpp中添加了方法

    void LineInstrument::shiftPressEvent(QKeyEvent *event, ImageArea &imageArea)
{
    if (imageArea.isPaint())
    {
        imageArea.setImage(mImageCopy);
        double Y = mStartPoint.y() - mEndPoint.y();
        double X = mStartPoint.x() - mEndPoint.x();

        if (isMod(event->key()) && fabs(X) > fabs(Y))
        {
            mEndPoint.setY(mStartPoint.y());
            paint(imageArea, false);
        }

        else if (isMod(event->key()) && fabs(Y) >= fabs(X))
        {
            mEndPoint.setX(mStartPoint.x());
            paint(imageArea, false);
        }

    }
}

    bool LineInstrument::isMod(int key)

{
    if (key == Qt::Key_Shift)
    {
        return true;
    }

    return false;
}

编辑前的LineInstrument标题文件

#ifndef LINEINSTRUMENT_H
#define LINEINSTRUMENT_H

#include "abstractinstrument.h"

#include <QtCore/QObject>
#include <QKeyEvent>

/**
 * @brief Line instrument class.
 *
 */
class LineInstrument : public AbstractInstrument
{
    Q_OBJECT

public:
    explicit LineInstrument(QObject *parent = 0);

    void mousePressEvent(QMouseEvent *event, ImageArea &imageArea);
    void mouseMoveEvent(QMouseEvent *event, ImageArea &imageArea);
    void mouseReleaseEvent(QMouseEvent *event, ImageArea &imageArea);
    void shiftPressEvent(QKeyEvent *event, ImageArea &imageArea);
    bool isMod(int key);
protected:
    void paint(ImageArea &imageArea, bool isSecondaryColor = false, bool additionalFlag = false);

private:
    double radianAngle;
    double degreeAngle;
};

#endif // LINEINSTRUMENT_H
编辑

LineInstrument标题文件

    #ifndef LINEINSTRUMENT_H
#define LINEINSTRUMENT_H

#include "abstractinstrument.h"

#include <QtCore/QObject>
#include <QKeyEvent>

/**
 * @brief Line instrument class.
 *
 */
class LineInstrument : public AbstractInstrument
{
    Q_OBJECT

public:
    explicit LineInstrument(QObject *parent = 0);

    void mousePressEvent(QMouseEvent *event, ImageArea &imageArea);
    void mouseMoveEvent(QMouseEvent *event, ImageArea &imageArea);
    void mouseReleaseEvent(QMouseEvent *event, ImageArea &imageArea);
    void shiftPressEvent(QKeyEvent *event, ImageArea &imageArea);
    bool isMod(int key);
protected:
    void paint(ImageArea &imageArea, bool isSecondaryColor = false, bool additionalFlag = false);
};

#endif // LINEINSTRUMENT_H

1 个答案:

答案 0 :(得分:0)

部分问题在于您没有正确计算角度。这条线不符合你的想法:

degreeAngle = radianAngle * 180 / atan(1) * 4;

这与:

相同
degreeAngle = 4 * radianAngle * 180 / atan(1);

你应该做的是通过这样的方式为pi创建一个适当的命名常量:

const double kPi = atan(1.0) * 4.0;

你应该创建一个函数来将弧度转换为这样的度数:

double toDegrees(double radians)
{
    return radians * 180.0 / kPi;
}

您还可以通过简单地比较x delta和y delta来确定是否更容易想要水平或垂直对齐。如果X大于Y,那么您需要一条水平线,否则您需要一条垂直线。这样的事情可以解决问题:

if (fabs(X) > fabs(Y))
{
    mEndPoint.setY(mStartPoint.y());
}
else
{
    mEndPoint.setX(mStartPoint.x());
}

现在这是否能解决您的问题取决于您的绘图实际发生的方式。