如果您的小部件可以具有焦点,并“窃取”您的其他一些小部件的标题焦点,那就更容易了。像这样的东西可以工作:
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);
}
这会奏效。因为这样,即使您的 ToolTabWidgets 没有获得焦点,主小部件中的其他一些小部件也会获得焦点。一旦这种情况发生变化(无论用户是点击了窗口外,还是点击了窗口内的另一个控件,或者在这种情况下,按下了键或鼠标按钮,控件都会到达 eventFilter() 函数并关闭所有选项卡小部件。
顺便说一句,为了从其他小部件中捕获 MouseButtonPress、KeyPress 等,您也需要在它们上安装EventFilter,或者只需在主小部件中重新实现 QWidget::event(QEvent * event) 函数,并且在那里寻找那些事件。