2016-06-07 13 views
1

dies ist meine einfache Code ein- und ausblenden:QStateMachine wie QGraphicsView und QObject in verschiedenen QSTATE

Ich habe erstellt ein neues scene, view und QPixmapItem

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(); 

und nächstes habe ich erstellt ein neue QStateMachine mit zwei QState

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. Ich möchte die view in s1 anzeigen und object1 sichtbar machen.

  2. Mit einem Mausklick auf die Szene habe ich einen Übergang zu s2 hinzugefügt.

  3. In s2 möchte ich nur object1 verstecken.

Wie kann ich das tun? Jemand kann mir mit einem kleinen Tutorial helfen?

Ich verwende Qt 5.6.0 mit MinGW 4.9.2 32bit.

+0

Haben Sie [diese Antwort] (http://stackoverflow.com/a/37667951/1329652) gelesen? Es sieht so aus, als ob du immer wieder ähnliche Fragen stellst ... –

+0

Ja, ich habe die Antwort gelesen und festgestellt, dass ich einem 'QState' keine' Ansicht' zuordnen kann. Mein Problem ist, dass ich eine "Szene" habe und innerhalb dieser Szene habe ich 'QGraphicsPixmapObject'. Es ist ein Kartenspiel, also muss ich dieses Objekt 20 Mal verstecken und zeigen, und ich kann es nicht mit einem 'for' machen, also hast du mir gesagt, dass ich' QStateMachine' benutzen soll. Jetzt habe ich 'QState' und' QStateMachine' erstellt, kann sie aber nicht verwenden. Ich habe den Übergang von 's1' nach' s2' mit 'signals' hinzugefügt, und jetzt wende ich an, welches Objekt ich in jedem' QState' anzeigen möchte. Ist es möglich zu tun? –

+0

"Ich muss das Objekt 20 Mal verstecken und zeigen" Das gleiche? Meinst du, dass du es 20 mal blinzeln willst? Oder möchten Sie 20 verschiedene Objekte nacheinander zeigen? –

Antwort

0

Jeder QState hat entered und exited Signale, die Sie an Funktoren anschließen können. Dies ist eine gängige Redewendung im modernen Qt 5-Code. Die Funktoren können prägnant mit Lambda-Ausdrücken angegeben werden, wobei Sie beliebige Operationen auf Nicht-Objekte ausführen können, z. B. auf der QPixmapItem. Wenn QPixmapItem von QGraphicsObject abgeleitet ist, können Sie QState::assignProperty verwenden, um den gewünschten Sichtbarkeitsstatus zuzuweisen, anstatt show() und hide() aufzurufen.

Unten finden Sie ein vollständiges Beispiel.

// 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(); 
}