Unsolved How to override functionality for widgets hiding when losing mouse focus?
-
I need some kind of way to replace the existing functionality where a widget will hide automatically when a click occurs outside of it ( loses focus) with my own code to do something else instead.
-
Hi, and welcome to the Qt forum.
widget will hide automatically when [...] loses focus [...]
You can override
QWidget::focusOutEvent(QFocusEvent *event)
, see: focusOutEvent().class MyPlainTextEdit : public QPlainTextEdit { Q_OBJECT public: explicit MyPlainTextEdit(QWidget *parent = nullptr); protected: virtual void focusOutEvent(QFocusEvent *) override { hide(); } };
-
Thank you. The problem is that I need to implement this in the eventFilter of my QMainWindow to filter for the correct object. I cannot implement this function for the object I need since there's no class implementation for that object, it's all part of my QMainWindow. How would I do this?
-
Let's assume you have your
MainWindow
class and it contains the widgetplainTextEdit
.myeventfilter.h
#ifndef MYEVENTFILTER_H #define MYEVENTFILTER_H #include <QObject> class MyEventFilter : public QObject { Q_OBJECT public: MyEventFilter(QObject *parent = nullptr); protected: virtual bool eventFilter(QObject *watched, QEvent *event) override; }; #endif // MYEVENTFILTER_H
myeventfilter.cpp
#include "myeventfilter.h" #include <QEvent> #include <QWidget> MyEventFilter::MyEventFilter(QObject *parent) : QObject(parent) { } bool MyEventFilter::eventFilter(QObject *watched, QEvent *event) { if (event->type() == QEvent::FocusOut) { auto widget = dynamic_cast<QWidget *>(watched); widget->hide(); return true; } else { return QObject::eventFilter(watched, event); } }
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include "myeventfilter.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); auto myEventFilter = new MyEventFilter(this); ui->plainTextEdit->installEventFilter(myEventFilter); } // ...
-
Hi,
You can use,
yourWidget->setWindowFlags(Qt::Popup);
this will hide your widget when you click outside of it.