Grzyboo
1st August 2015, 22:44
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)
{
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);
}
Explanation:
iDraggingDistX / iDraggingDistY - distance between grabbed point and left top corner of the widget
pSelectedWidget - the widget we're dragging
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
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.
https://www.youtube.com/watch?v=DqeNngwCNMg&feature=youtu.be
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);
}
Explanation:
iDraggingDistX / iDraggingDistY - distance between grabbed point and left top corner of the widget
pSelectedWidget - the widget we're dragging
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
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.
https://www.youtube.com/watch?v=DqeNngwCNMg&feature=youtu.be