1

タッチイベントが発生するかどうかを調べようとするか、それ以外の場合はペイントします。


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


}
}



このコードは、次のようなエラーを示しています。
mywidget.cpp:116:47: エラー: 'QEvent*' から 'QPaintEvent*' への変換が無効です
mywidget.cpp:116:47: エラー: 'virtual void MyWidget::paintEvent(QPaintEvent*)' の引数 1 を初期化しています
mywidget.cpp:116:47: エラー: void 値が無視されないはずです
4

2 に答える 2

4

を呼び出したい場合は、次のようpaintEventにキャストする必要があります。QEvent*

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

しかし、他の人が言ったように、無限の再描画ループやスタックしたイベント ループに陥ったとしても、文句を言わないでください。

定期的な再描画が必要な場合は、 を設定して、QTimerウィジェットのupdate()スロットを呼び出すようにします。

于 2011-06-13T14:59:45.257 に答える
3

paintEvent()を直接呼び出すことはお勧めできません。Callrepaint()または代わりに。これらのupdate()メソッドはpaintEvent()適切なパラメーターを使用して呼び出します。

于 2011-06-13T12:52:13.580 に答える