EasyPaintというプログラムでシフトキーを押したときに、まっすぐな垂直/水平線を実装する作業を行っています。コードにエラーはありませんが、残念ながらプログラム自体には全く影響しません。私が線を引いてシフトを押すと、絶対に何もしません。以下のコードは私のメソッドshiftPressEventと私の他のメソッドisModです。私はラインを垂直アラインメントまたは水平アラインメントにスナップする必要があるかどうかを計算するために度の計算を試みましたが、明らかに意図された仕事をしていないようです。別の目が多分コードを分析して、どこに問題があるのかを知ることができれば、私は大いに感謝しています。また、それ以上の情報が必要な場合は、以下にコメントしてください。私はLineInstrumentのクラス全体を簡単に投稿できますが、かなり長いです。シフトキー(C++とQt 5.8)を押したときの完全直線/垂直線
編集する前に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
これらのメソッドが呼び出されていますか?あなたは何の要素を描いていますか? – eyllanesc
imageAreaを継承するクラスは何ですか? – eyllanesc
@eyllanesc imageAreaを継承するクラスはQWidgetだと私は信じています。また、LineInstrumentのすべてのメソッドで「View Call Hierarchy」を実行しましたが、実際にどこでも呼び出されることはありませんが、EasyPaintプログラム内で動作するため、私のメソッドはどこでも呼び出す必要はないと想定していました。唯一の方法はコンストラクタです。 – Chay