2016-06-07 3 views
1

이 내 간단한 코드입니다 : 내가QStateMachine

만든 새로운 제작 한 scene, viewQPixmapItem

QGraphicsScene *scena = new QGraphicsScene(); 
QGraphicsPixmapItem *object1= new QGraphicsPixmapItem(); 
object1->setPixmap(QPixmap(":/prova/prova.png")); 

QGraphicsView *view = new QGraphicsView(); 

view->setScene(scena); 
scena->addItem(object1); 

view->show(); 

와 옆 새로운 QStateMachineQState

QStateMachine *machine = new QStateMachine(); 
QState *s1 = new QState(); 
QState *s2 = new QState(); 

machine -> addState(s1); 
machine -> addState(s2); 

//mouse click in a void mousePressEvent 
s1 -> addTransition(this,SIGNAL(mouseclick()),s2); 

machine -> start(); 
  1. view을 표시하고 object1을 표시하고 싶습니다.

  2. 마우스를 클릭하여 전환점을 s2에 추가했습니다.

  3. s2 나는 단지 object1을 숨기고 싶습니다.

어떻게하면됩니까? 누군가가 작은 자습서로 나를 도울 수 있습니까?

저는 MinGW 4.9.2 32bit에서 Qt 5.6.0을 사용하고 있습니다.

+0

당신은 [이 답변을 읽었습니다] (http://stackoverflow.com/a/37667951/1329652)? 계속 비슷한 질문을 반복하고있는 것처럼 보입니다. –

+0

예, 답을 읽었으며'QState'에'보기 '를 지정할 수 없다는 것을 깨달았습니다. 내 문제는 내가'장면'과'장면'안에'QGraphicsPixmapObject'가 있다는 것입니다. 그것은 카드 게임이기 때문에 나는 그 물체를 20 번 숨기고 보여 주어야하며'for '를 사용해서 그것을 할 수 없으므로'QStateMachine'을 사용하라고 말했습니다. 이제'QState'와'QStateMachine'을 만들었지 만 그것을 사용할 수는 없습니다. 's1'에서's2'로'signals'으로 전환했는데 이제는 각 QState에서 보여주고 싶은 물건을 지정하려고합니다. 할 수 있습니까? –

+0

"그 물건을 숨기고 20 번이나 보여줘야 해."같은거야? 20 번 깜박이시겠습니까? 아니면 순차적으로 20 개의 다른 대상을 보여주고 싶습니까? –

답변

0

QState에는 펑터를 연결할 수있는 enteredexited 신호가 있습니다. 이것은 현대 Qt 5 코드에서 일반적인 관용구입니다. 펑터는 람다 식을 사용하여 간결하게 표현할 수 있습니다. 여기서 넌 QPixmapItem과 같이 객체가 아닌 객체에 대해 임의의 연산을 호출 할 수 있습니다. 이 QGraphicsObject에서 파생 된 경우 show()hide() 대신 QState::assignProperty을 사용하여 원하는 가시성 상태를 할당 할 수 있습니다.

다음은 완전한 예입니다.

// https://github.com/KubaO/stackoverflown/tree/master/questions/scenestate-37684315 
#include <QtWidgets> 

void addTransition(QState * src, QObject * eventSource, QEvent::Type type, QAbstractState * dst) 
{ 
    auto transition = new QEventTransition(eventSource, type); 
    transition->setTargetState(dst); 
    src->addTransition(transition); 
} 

struct Window : public QWidget { 
    QHBoxLayout m_layout{this}; 
    QGraphicsScene m_scene; 
    QGraphicsPixmapItem m_item; 
    QGraphicsView m_view{&m_scene}; 

    QStateMachine m_mach; 
    QState s1{&m_mach}; 
    QState s2{&m_mach}; 
    Window() { 
     m_layout.addWidget(&m_view); 
     QPixmap pix{128, 128}; 
     QPainter p{&pix}; 
     p.setBrush(Qt::white); 
     p.drawRect(pix.rect().adjusted(0,0,-1,-1)); 
     p.drawText(pix.rect(), "Hello"); 
     m_item.setPixmap(pix); 
     m_scene.addItem(&m_item); 

     // I want to show the view in s1... 
     s1.assignProperty(&m_view, "visible", true); 
     // and set object1 visible. 
     s1.connect(&s1, &QState::entered, [&]{ m_item.show(); }); 
     // With a mouse click on the scene I've added a transition to s2. 
     addTransition(&s1, &m_view, QEvent::MouseButtonPress, &s2); 
     // In s2 I want to hide only object1. 
     s2.connect(&s2, &QState::entered, [&]{ m_item.hide(); }); 
     m_mach.setInitialState(&s1); 
     m_mach.start(); 
    } 
}; 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    Window w; 
    w.show(); 
    return app.exec(); 
}