попробуйте использовать QMouseEvent

У меня проблема с QMouseEvent:

void Gioco::gioco_G1()
{
QMouseEvent *mouse = new QMouseEvent;
bool stato = false;

do
{
    if (mouse->KeyPress() == Qt::MouseButton::LeftButton) {
        qDebug()<<"entra nell'if";
        if (img_mano1G1 -> isUnderMouse()) {giocata_G1 = manoG1[0]; stato = true;}
        else if (img_mano2G1 -> isUnderMouse()) {giocata_G1 = manoG1[1]; stato = true;}
        else if (img_mano3G1 -> isUnderMouse()) {giocata_G1 = manoG1[2]; stato = true;}
    }

} while (stato == false);   //repeat until I enter an if
}

Я создал сцену и вставил в нее QGraphicsPixmapItem. Теперь я хочу ввести «если», когда я нажимаю на указанный QGraphicsPixmapItem.

Например, когда я нажимаю на img_manoG1, я хочу ввести первое «если».

Как я могу сказать программе остановиться и дождаться ввода мыши?

Я новичок в Qt, и я впервые использую объекты, поэтому я делаю много логических ошибок, поэтому использование QStateMachine - это большая проблема...

Это единственный способ сделать это? Я пытаюсь объяснить свою программу:

Я хочу создать карточную игру, и в предыдущей версии я использовал старую графическую библиотеку с такой последовательностью команд:

-> print cards on the scene 
-> wait for a mouse input (with a do-while)
-> if(isMouseClick(WM_LBUTTONDOWN)) 
-> if(mouse position is on the first card) 
-> select that card. So i wish to do the same thing with QGraphics. 

Таким образом я говорю программе:

-> print cards 
-> wait for a mouse event 
-> print the card that I've selected with that event. 

Теперь я хочу изменить графику программы и представил QGraphics. Я создал сцену и распечатал на ней «карточку» всех объектов, так что теперь я хочу сказать программе:

-> print the object and wait the mouse input
-> if a card is to selected with the left clik
-> print that card in scene, wait 1/2 second and go ahead with the program

Проблема в том, что я использую for от 1 до 20 (я должен запустить это 20 раз за матч). Я пытался запустить программу со случайным воспроизведением G1 и COM, но приложение зависает до последнего выполнения for, и я печатаю на сцене только последнюю конфигурацию карт. Это причина, потому что ранее я сказал, что хочу, чтобы программа остановилась...

Можно ли обойтись без QStateMachine? Просто сказать ему: «пауза», распечатать эту ситуацию, дождаться мышки и вперед?


person Davide Ferrari    schedule 01.06.2016    source источник
comment
Приведенный вами пример не соответствует действительности. См. там: codeprogress.com/cpp/libraries/qt/ и, возможно, здесь: youtube.com/watch?v=hO0u_pdTJKA   -  person Alexander V    schedule 01.06.2016


Ответы (1)


Поскольку вы сами создаете событие мыши, созданное по умолчанию, почему вы ожидаете, что оно будет содержать какие-либо полезные данные?

Для обработки событий необходимо переопределить соответствующий виртуальный метод обработчика событий. В вашем случае вы можете переопределить QGraphicsScene::mousePressEvent в производном классе сцены.

Как я могу сказать программе остановиться и дождаться ввода мыши?

Вы же не хотите, чтобы программа останавливалась. Остановленная программа буквально заморожена и не принимает пользовательский ввод, это было бы бесполезно. Ваш цикл while будет иметь такой эффект - он никогда не завершится, так как он никогда не принимает никаких событий.

Что вы хотите сделать, так это изменить состояние пользовательского интерфейса, чтобы он реализовал ваше «остановленное» поведение. На самом деле вам нужно реагировать на щелчок мыши всякий раз, когда это происходит, если ваш пользовательский интерфейс находится в состоянии, когда он должен принимать щелчок мыши. Итак, вы должны спроектировать конечный автомат, который представляет состояния и переходы, которые должен выполнять пользовательский интерфейс вашей программы, а затем реализовать этот конечный автомат либо как явный QStateMachine, либо неявно, используя обычный подход «спагетти» для индивидуальной обработки различных состояний в обработчиках событий. и представление состояния в виде enum.

Для этого вам примерно нужно выполнить следующие шаги:

  1. Решите, какие объекты пользовательского интерфейса (экземпляры QWidget и QGraphicsItem) участвуют во взаимодействии. Все, что должно изменить свое поведение, задействовано.

  2. Разделите поведение вашего пользовательского интерфейса на конечный автомат, на самом простом уровне — на непересекающийся набор состояний (неиерархический автомат).

  3. Решите, какие изменения поведения вы хотите изменить в каждом состоянии.

  4. Реализуйте переменную состояния для представления текущего состояния: либо в виде конфигурации QStateMachine, либо в виде enum. Для QStateMachine каждое состояние будет экземпляром QState. Для enum каждое состояние будет значением перечисления.

  5. Реализуйте изменения поведения при переходах между состояниями. QStateMachine допускает более декларативный подход, когда вы говорите «при входе/выходе из этого состояния измените следующие свойства объектов» и «при получении этого события этим объектом сделайте то-то». Реализация на основе enum требует, чтобы вы явно обрабатывали события, переопределяя обработчики событий в классах, производных от QObject.

Прочтите Qt State Machine Framework, это хорошее введение в UML. Диаграммы состояний, и это поможет вам думать о поведении вашего пользовательского интерфейса более формализованно и дисциплинированно, даже если вы не используете эту конкретную реализацию диаграмм состояний UML.

person Kuba hasn't forgotten Monica    schedule 01.06.2016