Qt :: WindowStaysOnTopHint小部件始终处于活动状态

时间:2013-04-11 17:13:38

标签: qt user-interface

我有一个主窗口(QMainWindow)和一个带有标志Qt :: WindowStaysOnTopHint的小部件,它提供辅助信息和选项(让我们称之为帮助者)。如果我使用主窗口,然后单击任何其他应用程序,此窗口将不再处于活动状态(isActiveWindow()== false)。但是,如果我先使用帮助程序然后切换到其他应用程序/窗口(而不是主窗口),它将保持活动状态。如何处理从辅助窗口切换到其他应用程序?因此,即使QApplication :: activeWindow()也返回true。

.h文件:

//! Popup structure that contains listw_popup that shows tips
struct PopupWidget {
    PopupWidget(QWidget*);

    QWidget *base;
    QListWidget *listw_popup;
};

class MainWindow : public QMainWindow
{
    ...
private :
    PopupWidget popup_spec;
    ...
}

.cpp文件:

PopupWidget::PopupWidget(QWidget* parent)
{
    base = new QWidget(parent, Qt::SplashScreen | Qt::WindowStaysOnTop);
    listw_popup = new QListWidget(base);
}

MainWindow::MainWindow(QWidget *parent) : ... popup_spec(this) ...
{
    ...
}

当调用popup_spec.base.show()时,会出现此小部件。如果我点击这个小部件(意味着小部件变为活动状态),即使我切换到其他应用程序,它也会保持活动状态。

1 个答案:

答案 0 :(得分:0)

好的,如果我正确地按照您的要求,

您希望在应用程序失去焦点时隐藏辅助窗口小部件(其中包含Qt::WindowStaysOnTopHint)。

您可以尝试这样的事情:

MainWindow.cpp中,在构造函数中添加:

qApp->installEventFilter(this);

并在MainWindow.cpp中添加一个事件过滤器(不要忘记在.h中声明):

bool MainWindow::eventFilter(QObject* object, QEvent* event) {
  if (event->type() == QEvent::ApplicationDeactivate)
    popup_spec->base->hide();
  return QWidget::eventFilter(object, event);
}

这将在切换应用时隐藏辅助窗口小部件。如果您希望反向功能在应用程序激活时显示帮助程序窗口小部件,请在同一事件过滤器中检查QEvent::ApplicationActivate并调用popup_spec->base->show();

相关问题