2

我有一个主窗口(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() 被调用时,这个小部件就会出现。如果我单击此小部件(意味着小部件变为活动状态),即使我切换到其他应用程序,它也会保持活动状态。

4

1 回答 1

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();

于 2013-04-12T12:41:47.120 回答