【问题标题】:invalid conversion from ‘QEvent*’ to ‘QPaintEvent*’从“QEvent*”到“QPaintEvent*”的无效转换
【发布时间】:2011-06-13 12:08:59
【问题描述】:

尝试查找是否发生触摸事件,或者只是绘制它们。


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 值没有被忽略,因为它应该被忽略

【问题讨论】:

  • 也许你忘了包含
  • 你不能写return MyWidget::paintEvent( event);,因为它返回void而不是bool
  • 您可能只想处理触摸事件,然后为其余的返回父处理程序的结果:return QWidget::event( event ); 这将正确处理所有其他事件类型。

标签: qt events qt4 qpainter touch-event


【解决方案1】:

如果你想调用paintEvent,你需要转换QEvent*,比如:

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

但正如其他人所说,如果您发现自己处于无休止的重绘循环或其他卡住的事件循环中,请不要抱怨。

如果您想要定期重绘,请设置 QTimer 并让它调用您小部件的 update() 插槽。

【讨论】:

    【解决方案2】:

    直接调用paintEvent() 不是一个好习惯。请改为调用repaint()update()。然后这些方法将使用正确的参数调用paintEvent()

    【讨论】:

    • 但它会再次被 MyWidget::event() 收集。它收集所有事件仪式。所以我应该以某种方式调用paintEvent()
    • 你不应该做任何事情......只是不要在你的event() 方法中处理 QEvent::Paint 案例。当你调用 repaint/update 时,paintEvent 方法将被调用。
    • 我尝试调用事件函数,但它不起作用。我应该在哪里称呼它
    • 你可以从任何地方调用它,只是不能在 paintEvent() 或 event() 方法中。
    • 我已经在使用定时器来每 25 毫秒调用一次更新,但所有事件都将被 MyWidget::event() rite 吸收...
    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 2017-05-08
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多