• 5756阅读
  • 1回复

在ScorllArea控件设置完eventFilter后,成员类QCheckBox收不到PaintEvent了 [复制链接]

上一主题 下一主题
离线china_qhope
 

只看楼主 倒序阅读 楼主  发表于: 2014-07-22
— 本帖被 alexltr 从 Qt 作品展 移动到本区(2014-07-22) —
有三个类:
继承自QScrollArea的子类HHScrollArea,
HHScrollArea包含了继承自QPushButton的HHItem类,
HHItem类包含了继承QCheckBox的子类HHCheckBox:
  1. bool HHScrollArea::eventFilter(QObject *target, QEvent *event)
  2. {
  3.     QMouseEvent* mouseEvent = NULL;
  4.     QEvent* evt = event;
  5.     QEvent::Type enType = QEvent::None;
  6.     Qt::MouseButton buttons = Qt::LeftButton;
  7.     if (event)
  8.     {
  9.         switch (event->type())
  10.         {
  11.         case QEvent::TouchBegin:
  12.             enType = QEvent::MouseButtonPress;
  13.             break;
  14.         case QEvent::TouchUpdate:
  15.             enType = QEvent::MouseMove;
  16.             break;
  17.         case QEvent::TouchEnd:
  18.             enType = QEvent::MouseButtonRelease;
  19.             buttons = Qt::NoButton;
  20.             break;
  21.         default:
  22.             break;
  23.         }
  24.     }
  25.     if("CheckBox" == target->objectName())
  26.     {
  27.          qDebug()<<" target:"<<target->objectName()<<"  event type:"<<event->type();
  28.          (HHCheckBox*)target->event(event);
  29.     }
  30.     if (enType != QEvent::None)
  31.     {
  32.         QTouchEvent* touch = (QTouchEvent*)event;
  33.         points = touch->touchPoints();
  34.         mouseEvent = new QMouseEvent (enType, points[0].pos().toPoint(),
  35.                                       mapToGlobal(points[0].pos().toPoint()),
  36.                                       Qt::LeftButton, buttons, Qt::NoModifier);
  37.         evt = (QEvent*)mouseEvent;
  38.     }
  39.     bool bResult = MouseEventProc(target, evt);
  40.     if (mouseEvent)
  41.     {
  42.         delete mouseEvent;
  43.     }
  44.     if (!bResult)
  45.     {
  46.         bResult = QScrollArea::eventFilter(target, event);
  47.     }
  48.     return bResult;
  49. }
继承自QScrollArea的子类HHScrollArea,
HHItem类,HHCheckBox 均将eventFilter设置到了HHScrollArea中(非HHScrollArea的viewPort,而是this),
如下,HHCheckBox设置eventFilter
  1. void HHItem::InitCheckBox()
  2. {
  3.     m_pCheckBox = new HHCheckBox(this);
  4.     m_pCheckBox->setFixedSize(CHECKBOX_WIDTH, CHECKBOX_HEIGHT);
  5.     m_pCheckBox->setObjectName("CheckBox");
  6. //    qDebug()<<this->parentWidget()->parentWidget()->parentWidget()->objectName();
  7.     m_pCheckBox->installEventFilter(this->parentWidget()->parentWidget()->parentWidget());    [backcolor=#f7f7f7][color=#333333]//scrollarea[/color][/backcolor]
  8.     m_pCheckBox->move(4, (ITEM_HEIGHT - CHECKBOX_HEIGHT) / 2);
  9.     connect(m_pCheckBox, SIGNAL(clicked(bool)), this, SLOT(slotCheckBoxClick(bool)));
  10. }
如下,HHItem设置eventFilter
  1. for (ssize_t i = 0; i < createNewBtnCnt; i++)
  2.         {
  3.             pItem = new HHItem(m_pViewArea);
  4.             if (pItem)
  5.             {
  6.                 // set focus
  7.                 pItem->setFocusPolicy(Qt::NoFocus);
  8.                 // set btn Image
  9.                 //                pItem->setStyleSheet(StyleSheet::Btn::style);
  10.                 // event filter
  11.                 pItem->installEventFilter(this);
  12.             }
  13.         }
只能在show的时候打出一次12(QEvent::paint),每次鼠标事件发生的时候只能打出3,2(Press,Release)
而在我的Demo里。每次鼠标时间发生前,会有QEvent::paint进入event()中.
为什么会这样呢?难道eventFilter过滤不了QpaintEvent事件么?



离线china_qhope

只看该作者 1楼 发表于: 2014-07-23
我实现的方式是QScrollArea->viewPort->QWidget->QButton->QCheckBox
根据以上的方式寻找哪一步有错误,发现在button上,设置了disabled。导致checkbox接受不到update事件。
看来以后发生这样的事情后,还是的冷静下来总结下类间关系,然后挨个步骤查找。才能迅速的解决问题。
-----------------------------
以上,这次小错误的总结,
快速回复
限100 字节
 
上一个 下一个