bool ItemWidget::filterMouseEvents(QTextEdit *edit, QEvent *event) { QEvent::Type type = event->type(); switch (type) { case QEvent::MouseButtonPress: case QEvent::MouseButtonDblClick: { QMouseEvent *e = static_cast<QMouseEvent*>(event); if ( !canMouseInteract(*e) ) e->ignore(); else if (e->button() == Qt::LeftButton) edit->setTextCursor( edit->cursorForPosition(e->pos()) ); break; } case QEvent::MouseMove: { QMouseEvent *e = static_cast<QMouseEvent*>(event); if ( !canMouseInteract(*e) ) e->ignore(); break; } case QEvent::MouseButtonRelease: { QMouseEvent *e = static_cast<QMouseEvent*>(event); if ( canMouseInteract(*e) && edit->textCursor().hasSelection() ) edit->copy(); e->ignore(); break; } default: return false; } Qt::TextInteractionFlags flags = edit->textInteractionFlags(); if (event->isAccepted()) flags |= Qt::TextSelectableByMouse; else flags &= ~Qt::TextSelectableByMouse; edit->setTextInteractionFlags(flags); return false; }