Russian Qt Forum
Ноябрь 23, 2024, 09:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Объекты в paintEvent  (Прочитано 3708 раз)
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
    };
};
Спасибо!
« Последнее редактирование: Июль 02, 2016, 16:32 от Xambey » Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Июль 02, 2016, 16:33 »

Возьмите блок из case в { } или вынесите локальную переменную из switch.
Записан
Xambey
Гость
« Ответ #2 : Июль 02, 2016, 16:46 »

Возьмите блок из case в { } или вынесите локальную переменную из switch.
Но это же не нормально), должно все работать, почему все-таки?
Записан
Xambey
Гость
« Ответ #3 : Июль 02, 2016, 16:50 »

Возьмите блок из case в { } или вынесите локальную переменную из switch.
Но это же не нормально), должно все работать, почему все-таки?
Перестановка объявление до switch работает, но все же просветите пожалуйста)
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Июль 02, 2016, 16:51 »

Но это же не нормально), должно все работать, почему все-таки?
Кому должно? Улыбающийся
Записан
Xambey
Гость
« Ответ #5 : Июль 02, 2016, 16:54 »

Но это же не нормально), должно все работать, почему все-таки?
Кому должно? Улыбающийся
мне:), это же считается блоком если я точно помню, это я что-то напутал, или не я виноват? И из-за чего это возникает на будущее?)
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Июль 02, 2016, 17:03 »

это же считается блоком если я точно помню
Нет. Блоком является весь switch, поэтому переменная должна быть доступна во всех ветках, а создаете вы ее только в одной.
Записан
Xambey
Гость
« Ответ #7 : Июль 02, 2016, 17:10 »

это же считается блоком если я точно помню
Нет. Блоком является весь switch, поэтому переменная должна быть доступна во всех ветках, а создаете вы ее только в одной.
оО хорошо, спасибо) буду знать
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Июль 03, 2016, 12:05 »

если используется С++11, то можно обойтись без создания переменной, воспользовавшись конструктором QPolygon, принимающим std::initializer_list
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 22.