2013-04-11 3 views
2

У меня есть главное окно (QMainWindow) и виджет с флагом Qt :: WindowStaysOnTopHint, который предоставляет вспомогательную информацию и опции (назовем ее помощником). Если я работаю с основным окном, а затем нажимаю на любое другое приложение, это окно перестает быть активным (isActiveWindow() == false). Но если я сначала работаю с помощником, а затем переключаюсь на другое приложение/окно (не в главное окно), он остается активным. Как я могу обращаться с переключением из вспомогательного окна в другое приложение? Даже QApplication :: activeWindow() возвращает true из-за этого.Qt :: WindowStaysOnTopHint виджет всегда активен

.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() вызывается этот виджет появляется. И если я нажму на этот виджет (означает, что виджет станет активным), он останется активным, даже если я переключусь на другое приложение.

+0

Какое поведение вы хотите достичь? – Jay

+0

@Jay Мне нужно окно помощника исчезает, когда я переключаюсь с этого приложения на другое. – YAPPO

+0

Я не могу воспроизвести вашу проблему. Я предполагаю, что вспомогательный виджет - это без родительского виджетов? можете ли вы показать минимальный код, показывающий ваше текущее поведение? – Viv

ответ

0

ИТАК, если я следовать вашим требованиям правильно,

Вы хотите вы Helper виджет (который имеет 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();

+0

Я пытался реализовать это поведение, когда я наткнулся на этот вопрос. Ваше решение действительно работает, но есть улов. Предположим, что 'popup_spec' невидим, когда приложение было отключено. Он будет виден, когда приложение будет активировано снова, верно? Поэтому единственный способ найти это - сохранить состояние моих диалогов приложений, когда я получаю событие «ApplicationDeactivate». – McLeary

Смежные вопросы