2011-06-13 4 views
1

en essayant de trouver si l'événement tactile se produit ou bien simplement les peindre.invalide la conversion de 'QEvent *' à 'QPaintEvent *'


bool MyWidget::event(QEvent *event) 
{ 
    switch (event->type()) 
    { 
      case QEvent::TouchBegin: 
      case QEvent::TouchUpdate: 
      case QEvent::TouchEnd: 
     { 

      QTouchEvent *touchEvent = static_cast(event); 

      if (touchEvent->touchPoints().count() == 2) 
      { 
       const QTouchEvent::TouchPoint &touchPoint1 = touchEvent->touchPoints().first(); 
       const QTouchEvent::TouchPoint &touchPoint2 = touchEvent->touchPoints().last(); 
       nx=touchPoint1.scenePos().x(); 
       ny=touchPoint1.scenePos().y(); 
       pix = QPixmap::grabWidget (this,nx,ny,1,1); 
       img = pix.toImage(); 
       rgb = img.pixel(0,0); 
       color.setRgb(rgb); 
       drawBit=1; 
      } 
     break; 
     } 

      case QEvent::Paint: 

        return MyWidget::paintEvent(event); 
       break; 

     default: 
      return false; 
      break; 
    } 

    return true; 
} 



void MyWidget::paintEvent(QPaintEvent *event) 
{ 

time_counter++; 
for(i=0;(ired,b[i]->green,b[i]->blue,255), Qt::SolidPattern)); 
painter.drawEllipse(b[i]->x,b[i]->y,b[i]->w, b[i]->w); 
painter.drawLine(b[i]->x+b[i]->w/2,b[i]->y+b[i]->w,b[i]->x+b[i]->w/2,b[i]->y+2*b[i]->w); 

if(b[i]->ballDead==false) 
b[i]->y+=b[i]->vy; 

if(drawBit==1 && b[i]->red==color.red() && b[i]->green==color.green() && b[i]->blue==color.blue()) 
ballHit(i); 


} 
} 



 
this code shows error like: 
mywidget.cpp:116:47: error: invalid conversion from ‘QEvent*’ to ‘QPaintEvent*’ 
mywidget.cpp:116:47: error: initializing argument 1 of ‘virtual void MyWidget::paintEvent(QPaintEvent*)’ 
mywidget.cpp:116:47: error: void value not ignored as it ought to be 
+0

Peut-être que vous avez oublié inclure ? – red1ynx

+1

Et vous ne pouvez pas écrire 'return MyWidget :: paintEvent (event);' parce qu'il renvoie 'void' au lieu de' bool'. – red1ynx

+0

Vous voudrez probablement simplement gérer l'événement touch, puis renvoyer le résultat du gestionnaire parent pour le reste: 'return QWidget :: event (event);' Cela gérera * all * des autres types d'événements correctement. –

Répondre

3

ne est pas une bonne pratique pour appeler paintEvent() directly.Call repaint() ou update() méthodes de instead.Those ensuite appeler paintEvent() avec le bon paramètre.

+0

Mais encore une fois, il sera collecté par MyWidget :: event(). il recueille tous les événements rites. donc en quelque sorte je devrais appeler paintEvent() – user767060

+0

Vous n'êtes pas censé faire quoi que ce soit .. juste ne pas gérer le cas QEvent :: Paint dans votre méthode 'event()'. Lorsque vous appelez repaint/update, la méthode paintEvent est appelée. – Abhijith

+0

J'ai essayé d'appeler dans la fonction d'événement, mais il faut travailler. Où dois-je l'appeler – user767060

3

Si vous voulez appeler paintEvent, vous aurez besoin de jeter le QEvent*, quelque chose comme:

paintEvent(static_cast<QPaintEvent*>(event)); 
return true; 

Mais comme d'autres l'ont dit, ne viennent pas se plaindre si vous vous trouvez dans une boucle sans fin de repeindre ou avec une boucle d'événement autrement bloquée.

Si vous souhaitez un repeint périodique, configurez un QTimer et appelez-le le logement update() du widget.

Questions connexes