maidamai
maidamai

Reputation: 712

How to hide a QWidget when mouse clicked on out side that widget

I want hide a QWidget when mouse clicks out of that widget just like it have a popup flag:

auto widget = new QWidget(this);
widget->setWindowFlag(Qt::Popup); // this widget will hide, when mouse click out of that widget.

For some reason, I can't set these flags and must implement some thing myself which behaves like this.

Or can I get a mouse event out of that widget?

Solution:

As I said, I can't use Qt flags and have to implement the similar behavior myself.My solution is installEventFilter to QApplication, in the override method eventFilter,I filter the QMouseEvent and send a signal.

Upvotes: 0

Views: 2196

Answers (1)

SimSim
SimSim

Reputation: 170

Yes, you can get a mouse event out of the widget.

Make a custom widget and reimplement mousePressEvent, which will catch the last click (the ouside-the-widget click that hides the "popup"). But be careful to add the call to QWidget::mousePressEvent(event) in the end, otherwise the last click will be lost and your widget will remain onscreen.

CustomWidget::CutomWidget(QWidget *parent) : QWidget(parent)
{
  setWindowFlags(Qt::Popup);
}

void CustomWidget::mousePressEvent(QMouseEvent *event)
{
  if (!this->underMouse()) {
  //if the click is not on the widget, i.e. if it's the click that hides it,
  // you caught it, do what you want to do here.
  }
  QWidget::mousePressEvent(event); 
}

Hope it helps.

Upvotes: 1

Related Questions