Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Xambey от Июль 02, 2016, 16:28



Название: Объекты в paintEvent
Отправлено: Xambey от Июль 02, 2016, 16:28
Пишу игру "Змейка", для отрисовки элементов змеи использую QPainter, вопрос: "Почему выскакивает ошибка C:\Users\Andrey\Documents\GitHub\QSnake\QSnake\itemsnake.cpp:107: ошибка: jump to case label [-fpermissive]
         case CommonDate::TurnRightDown :
                          ^
если я не объявляю объект QPolygon poly с ключевым словом static (как в справке Qt для примера drawPolygon)", это не норма? или я что-то забыл?

проект: https://github.com/Xambey/QSnake

Q

Код:
void ItemSnake::paintEvent(QPaintEvent *)
{
    RenderMode(direction);
}

void ItemSnake::RenderMode(Direction dir)
{
    QPainter painter(this);

    painter.setPen(QPen(Qt::green,2,Qt::SolidLine));

    if(dir == CommonDate::Down || dir == CommonDate::Up) {
        painter.drawLine(x() - offest, y() - offest, x() - offest, y() + offest);
        painter.drawLine(x() + offest, y() - offest, x() + offest, y() + offest);
        //painter.setBackground(QBrush(Qt::green));
        painter.setBrush(Qt::green);
//        QPalette pal;
//        pal.setColor(this->backgroundRole(), Qt::green);

//        this->setPalette(pal);
//        this->setAutoFillBackground(true);
//        qDebug() << scene.sceneRect();
    }

    if(dir == CommonDate::Right || dir == CommonDate::Left) {
        painter.drawLine(x() - offest, y() - offest, x() + offest, y() - offest);
        painter.drawLine(x() - offest, y() + offest, x() + offest, y() + offest);
        painter.setBackground(QBrush(Qt::green));
    }
    switch (dir) {
        case CommonDate::TurnLeftUp :
          QPolygon poly;
          poly << QPoint(10,10) << QPoint(40,40) << QPoint(10,30) << QPoint(20,10);
          painter.setBrush(Qt::red);
          painter.drawPolygon(poly);
          break;
        default:
            //throw UnknownDirection;
            break;
    }
}

Объявление:
class ItemSnake : public QWidget, public CommonDate
{
    Q_OBJECT
public:
    explicit ItemSnake(QGraphicsScene& scene, CommonDate::Direction dir);
private:
    CommonDate::Direction direction; //direction snake
    const int offest;
    QGraphicsScene& scene;
protected:
    void RenderMode(CommonDate::Direction dir); //render item on the mode
    void paintEvent(QPaintEvent*);
};

class CommonDate //class, showing the direction of movement ItemSnake
{
protected:
    enum Direction
    {
        Right,
        Left,
        Up,
        Down,
        TurnRightUp,
        TurnLeftUp,
        TurnRightDown,
        TurnLeftDown,
        RightHead,
        LeftHead,
        UpHead,
        DownHead
    };
};
Спасибо!


Название: Re: Объекты в paintEvent
Отправлено: Old от Июль 02, 2016, 16:33
Возьмите блок из case в { } или вынесите локальную переменную из switch.


Название: Re: Объекты в paintEvent
Отправлено: Xambey от Июль 02, 2016, 16:46
Возьмите блок из case в { } или вынесите локальную переменную из switch.
Но это же не нормально), должно все работать, почему все-таки?


Название: Re: Объекты в paintEvent
Отправлено: Xambey от Июль 02, 2016, 16:50
Возьмите блок из case в { } или вынесите локальную переменную из switch.
Но это же не нормально), должно все работать, почему все-таки?
Перестановка объявление до switch работает, но все же просветите пожалуйста)


Название: Re: Объекты в paintEvent
Отправлено: Old от Июль 02, 2016, 16:51
Но это же не нормально), должно все работать, почему все-таки?
Кому должно? :)


Название: Re: Объекты в paintEvent
Отправлено: Xambey от Июль 02, 2016, 16:54
Но это же не нормально), должно все работать, почему все-таки?
Кому должно? :)
мне:), это же считается блоком если я точно помню, это я что-то напутал, или не я виноват? И из-за чего это возникает на будущее?)


Название: Re: Объекты в paintEvent
Отправлено: Old от Июль 02, 2016, 17:03
это же считается блоком если я точно помню
Нет. Блоком является весь switch, поэтому переменная должна быть доступна во всех ветках, а создаете вы ее только в одной.


Название: Re: Объекты в paintEvent
Отправлено: Xambey от Июль 02, 2016, 17:10
это же считается блоком если я точно помню
Нет. Блоком является весь switch, поэтому переменная должна быть доступна во всех ветках, а создаете вы ее только в одной.
оО хорошо, спасибо) буду знать


Название: Re: Объекты в paintEvent
Отправлено: kambala от Июль 03, 2016, 12:05
если используется С++11, то можно обойтись без создания переменной, воспользовавшись конструктором QPolygon, принимающим std::initializer_list