How disable QMouseMoveEvent of QPushButton in user-defined titlebar ?
-
wrote on 21 Feb 2018, 03:07 last edited by
When i design a titlebar myself, the QPushButton of Minimize,Maxmize,Close in the titlebar will also trigger QMouseMoveEvent which I don't want.
void TitleBar::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton){ relativePos = event->pos(); } } void TitleBar::mouseMoveEvent(QMouseEvent *event) { emit moveMainWindow(event->globalPos() - relativePos); }
Source code: https://github.com/sonichy/NeteaseMusic
-
When i design a titlebar myself, the QPushButton of Minimize,Maxmize,Close in the titlebar will also trigger QMouseMoveEvent which I don't want.
void TitleBar::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton){ relativePos = event->pos(); } } void TitleBar::mouseMoveEvent(QMouseEvent *event) { emit moveMainWindow(event->globalPos() - relativePos); }
Source code: https://github.com/sonichy/NeteaseMusic
wrote on 21 Feb 2018, 04:42 last edited byYou can simply set the flag to handle it. like this:
// in titlebar.h bool isClicked{false}; void mouseReleaseEvent(QMouseEvent *event); // in titlebar.cpp void TitleBar::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton){ //qDebug() << "mousePress" << event->pos(); relativePos = event->pos(); isClicked = true; } } void TitleBar::mouseMoveEvent(QMouseEvent *event) { //qDebug() << event->globalPos() << "-" << relativePos << "=" << event->globalPos() - relativePos; if (isClicked) emit moveMainWindow(event->globalPos() - relativePos); } void TitleBar::mouseReleaseEvent(QMouseEvent *event) { Q_UNUSED(event) isClicked = false; }
-
wrote on 23 Feb 2018, 13:50 last edited by Andeol
You could use an eventFilter (http://doc.qt.io/archives/qt-4.8/qobject.html#eventFilter).
Most of the time, just using mousePressEvent is better if it's enough for what you want.
But if you need to be able to check which item is receiving an event, you can check it by testing the QObject * argument in the eventFilter method. -
You could use an eventFilter (http://doc.qt.io/archives/qt-4.8/qobject.html#eventFilter).
Most of the time, just using mousePressEvent is better if it's enough for what you want.
But if you need to be able to check which item is receiving an event, you can check it by testing the QObject * argument in the eventFilter method.wrote on 24 Feb 2018, 02:45 last edited by@Andeol Under your advice, I solved the problem!
TitleBar::TitleBar(QWidget *parent) : QWidget(parent) { ... pushButton_minimize->installEventFilter(this); pushButton_maximize->installEventFilter(this); pushButton_close->installEventFilter(this); ... } bool TitleBar::eventFilter(QObject *obj, QEvent *event) { if ( (obj == pushButton_minimize || obj == pushButton_maximize || obj == pushButton_close) && event->type() == QEvent::MouseMove ) { return true; // filter } else { return false; } // pass the event on to the parent class return QWidget::eventFilter(obj, event); }
4/4