I'm making some draggable widgets. Labels work fine any way I do it, but there is obviously a problem with PlainTextEdits. I've installed an EventFilter on PlainTextEdit's viewport and want to drag the whole widget with mouse movement.
bool FilerPlainText2Click
::eventFilter(QObject* object,
QEvent* event
) {
if(event
->type
() == QEvent::MouseButtonDblClick) //some code here (set pSelectedWidget)
else if(event
->type
() == QEvent::MouseButtonPress && ((QMouseEvent*)event
)->button
() == Qt
::LeftButton) //some code here (set bDragging true)
else if(event
->type
() == QEvent::MouseMove) {
QWidget* pSelected
= ((QWidget*)object
)->parentWidget
();
// pointer to the whole widget MainWindow* pWin = (MainWindow*)pSelected->window(); // pointer to the main window, which this widget is placed in
if(pWin->bDragging)
{
int x = mEvent->x() - pWin->iDraggingDistX;
int y = mEvent->y() - pWin->iDraggingDistY;
QRect rect
(x, y, pWin
->pSelectedWidget
->width
(), pWin
->pSelectedWidget
->height
());
pWin->pSelectedWidget->setGeometry(rect);
qDebug() << "mEvent pos: " << mEvent->x() << " | " << mEvent->y();
}
return true;
}
else
return QObject::eventFilter(object,event
);
}
bool FilerPlainText2Click::eventFilter(QObject* object, QEvent* event)
{
if(event->type() == QEvent::MouseButtonDblClick)
//some code here (set pSelectedWidget)
else if(event->type() == QEvent::MouseButtonPress && ((QMouseEvent*)event)->button() == Qt::LeftButton)
//some code here (set bDragging true)
else if(event->type() == QEvent::MouseMove)
{
QWidget* pSelected = ((QWidget*)object)->parentWidget(); // pointer to the whole widget
MainWindow* pWin = (MainWindow*)pSelected->window(); // pointer to the main window, which this widget is placed in
if(pWin->bDragging)
{
QMouseEvent* mEvent = (QMouseEvent*)event;
int x = mEvent->x() - pWin->iDraggingDistX;
int y = mEvent->y() - pWin->iDraggingDistY;
QRect rect(x, y, pWin->pSelectedWidget->width(), pWin->pSelectedWidget->height());
pWin->pSelectedWidget->setGeometry(rect);
qDebug() << "mEvent pos: " << mEvent->x() << " | " << mEvent->y();
}
return true;
}
else
return QObject::eventFilter(object,event);
}
To copy to clipboard, switch view to plain text mode
Explanation:
iDraggingDistX / iDraggingDistY - distance between grabbed point and left top corner of the widget
pSelectedWidget - the widget we're dragging
iDraggingDistX / iDraggingDistY - distance between grabbed point and left top corner of the widget
pSelectedWidget - the widget we're dragging
To copy to clipboard, switch view to plain text mode
qDebug's effect:
mEvent pos: 217 | 462
mEvent pos: 127 | 62
mEvent pos: 216 | 462
mEvent pos: 126 | 62
mEvent pos: 216 | 463
mEvent pos: 125 | 62
mEvent pos: 215 | 463
mEvent pos: 124 | 62
mEvent pos: 215 | 464
mEvent pos: 123 | 62
mEvent pos: 217 | 462
mEvent pos: 127 | 62
mEvent pos: 216 | 462
mEvent pos: 126 | 62
mEvent pos: 216 | 463
mEvent pos: 125 | 62
mEvent pos: 215 | 463
mEvent pos: 124 | 62
mEvent pos: 215 | 464
mEvent pos: 123 | 62
To copy to clipboard, switch view to plain text mode
For some reason every time i move my widget by 1 pixel, mEvent's coordinates change (they seem to be realtive to widget once and relative to main window second time). My widget is obviously blinking in both positions. Why is this?
I realise it may sound very confusing and i might not be clear enough. Adding a video for clarity.
Bookmarks