如果鼠标点击它外部,关闭窗口小部件窗口

这是一个鸡和鸡蛋的问题。 当鼠标在外面点击时,我希望我的窗口小部件窗口关闭。 据我了解,我的小部件没有鼠标事件发生在它外面。 有一个SetFocus插槽,但其对应部件或焦点损失在哪里? “focusOutEvent”不会被我的班级调用。

我的窗口小部件窗口是一个窗口小部件,总是显示在我的主窗口上,它是一个“Qt :: ToolTip”,所以我认为可能会出现一些问题。 有什么办法呢?

我的目标:我有一个自定义工具栏小部件,其中的按钮可能具有“下拉”小部件。 这些下拉窗口小部件没有标准的窗口框架。 我不希望他们从主窗口“窃取”标题焦点,我希望他们在用户单击区域外的任何地方的任何地方时立即消失。 我有严重的困难找到一个不妥协的Qt策略来完成这个任务。

我错过了什么吗? (赌我)。


我用了:

setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);

这似乎在OSX和Windows上运行良好。 我的窗口显示正确,不会从我主窗口的标题中窃取焦点,并且只要我点击它外面,就会正确调用焦点丢失事件。


如果你的小部件可以有焦点,并'窃取'其他小部件的标题焦点,那就更容易了。 像这样的东西可以工作:

class ToolBarWidget : public QWidget
{
    Q_OBJECT

public:
    explicit ToolBarWidget(QWidget * parent = 0)
    {
        setFocusPolicy(Qt::ClickFocus);
    }

protected:
    void focusOutEvent(QFocusEvent * event)
    {
        close();
    }
}

当你创建任何你想做的小工具时:

ToolBarWidget * pWidget = new ToolBarWidget(this);
pWidget->show();
pWidget->setFocus();

完成! 好吧,我猜不安静。 首先,您不希望ToolBarWidget首先获得任何焦点。 其次,您希望用户能够在任何地方点击并隐藏ToolBarWidget。 因此,您可以跟踪您创建的每个ToolBarWidget。 例如,在'QList ttWidgets'成员变量中。 然后,每当你创建一个新的ToolBarWidget时,你都会这样做:

ToolBarWidget * pWidget = new ToolBarWidget(this);
pWidget->installEventFilter(this);
pWidget->show();

并在您的主窗口小部件类中实现eventFilter()函数。 就像是:

bool MainWidget::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::FocusOut ||
        event->type() == QEvent::KeyPress ||
        event->type() == QEvent::MouseButtonPress)
    {
        while (!ttWidgets.isEmpty()) {
            ToolBarWidget * p = ttWidgets->takeFirst();
            p->close();
            p->deleteLater();
        }
    }
    return MainWidget::eventFilter(obj, event);
}

这将起作用。 因为这样,即使你的ToolTabWidget没有得到关注,你的主窗口小部件中的一些其他小部件也有焦点。 一旦这种变化发生了(无论用户是否点击了窗口或其内部的其他控件,或者在这种情况下,按下了一个按键或鼠标按钮,控件就会到达该eventFilter()函数并关闭所有标签小部件。

顺便说一句,为了捕获其他小部件中的MouseButtonPress,KeyPress等,您需要在它们上安装EventEventFilter,或者只需在主小部件中重新实现QWidget :: event(QEvent * event)函数,然后查找那些那里的事件。


你可以像这样使用QDesktopWidget.h来做到这一点

void MainWindow::on_actionAbout_triggered()
{
    AboutDialog aboutDialog;
    //Set location of player in center of display
    aboutDialog.move(QApplication::desktop()->screen()->rect().center() -aboutDialog.rect().center());
    // Adding popup flags so that dialog closes when it losses focus
    aboutDialog.setWindowFlags(Qt::Popup);
    //finally opening dialog
    aboutDialog.exec();

}
链接地址: http://www.djcxy.com/p/39289.html

上一篇: Close Widget Window if mouse clicked outside of it

下一篇: Should the name of my classes begin with 'Q' in Qt?