如果鼠标点击它外部,关闭窗口小部件窗口
这是一个鸡和鸡蛋的问题。 当鼠标在外面点击时,我希望我的窗口小部件窗口关闭。 据我了解,我的小部件没有鼠标事件发生在它外面。 有一个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