Shift键点击qt?

时间:2017-03-19 02:01:07

标签: c++ qt

我正在使用QT5 C ++中的绘图程序,我正在尝试修改一个绘制线条的函数,以包含在单击shift键时应绘制的45度,水平或垂直特殊线。

以下是我所拥有的,但由于某种原因,密钥处理程序对我不起作用。

我收到了一个错误,但我不明白我需要做些什么才能解决下面附带的错误以及我之后修改过的paint函数的代码。我已将我在评论中所做的修改包含在可读性中

Runtime error

void LineInstrument::paint(ImageArea &imageArea, bool isSecondaryColor, bool)
{
    QPainter painter(imageArea.getImage());
    if(isSecondaryColor)
    {
        painter.setPen(QPen(DataSingleton::Instance()->getSecondaryColor(),
                            DataSingleton::Instance()->getPenSize() * imageArea.getZoomFactor(),
                            Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    }
    else
    {
        painter.setPen(QPen(DataSingleton::Instance()->getPrimaryColor(),
                            DataSingleton::Instance()->getPenSize() * imageArea.getZoomFactor(),
                            Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    }

    if(mStartPoint != mEndPoint) // here is where the line is drawn 
    {
        painter.drawLine(mStartPoint, mEndPoint); // let the line be drawn
        // my modifications start here
        if (QApplication::keyboardModifiers().testFlag(Qt::ShiftModifier) == true) { // check if shift key is active
            QMouseEvent *mouse;
            if (mouse->pos().x() > mouse->pos().y()){
                // transform to a horizontal line
                painter.save(); // save current painter state
                painter.rotate(180);
                painter.restore(); // restores painter state 

            }
            else if (mouse->pos().x() < mouse->pos().y()){
                // transfomr to a vertical line 
                painter.save();
                painter.rotate(90);
                painter.restore();
            }
            else{
                // transform to a 45 degree line
                painter.save();
                painter.rotate(45);
                painter.restore();
            }
        }// and end here

    }

    if(mStartPoint == mEndPoint)
    {
        painter.drawPoint(mStartPoint);
    }
    imageArea.setEdited(true);
    //    int rad(DataSingleton::Instance()->getPenSize() + round(sqrt((mStartPoint.x() - mEndPoint.x()) *
    //                                                                 (mStartPoint.x() - mEndPoint.x()) +
    //                                                                 (mStartPoint.y() - mEndPoint.y()) *
    //                                                                 (mStartPoint.y() - mEndPoint.y()))));
    //    mPImageArea->update(QRect(mStartPoint, mEndPoint).normalized().adjusted(-rad, -rad, +rad, +rad));
    painter.end();
    imageArea.update();
}

1 个答案:

答案 0 :(得分:1)

错误很清楚。

QMouseEvent *mouse; - 你声明了一个指向QMouseEvent的指针,但它在哪里被实例化?这只是一个指向某事的指针。

如果你想处理鼠标事件,你可能需要重载某种小部件的鼠标事件(mouseMoveEventmousePressEvent等)。这些将为您提供有效的QMouseEvent输入。