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 に答える