Мне нужно определить, когда мое приложение Qt 4.4.1 получает фокус.
Я предложил 2 возможных решения, но оба они работают не так, как хотелось бы.
В первом возможном решении я подключаю сигнал focusChanged () от qApp к слоту. В слоте я проверяю «старый» указатель. Если оно равно «0», то я знаю, что мы переключились на это приложение, и я делаю то, что хочу. Похоже, что это наиболее надежный способ заставить приложение обнаружить фокус в двух представленных здесь решениях, но страдает от проблемы, описанной ниже.
Во втором возможном решении я отверг подпрограмму «focusInEvent ()» и делаю то, что хочу, если причина - «ActiveWindowFocusReason».
В обоих этих решениях код выполняется в те моменты, когда я этого не хочу.
Например, у меня есть этот код, который переопределяет подпрограмму focusInEvent ():
void
ApplicationWindow::focusInEvent( QFocusEvent* p_event )
{
Qt::FocusReason reason = p_event->reason();
if( reason == Qt::ActiveWindowFocusReason &&
hasNewUpstreamData() )
{
switch( QMessageBox::warning( this, "New Upstream Data Found!",
"New upstream data exists!\n"
"Do you want to refresh this simulation?",
"&Yes", "&No", 0, 0, 1 ) )
{
case 0: // Yes
refreshSimulation();
break;
case 1: // No
break;
}
}
}
Когда это выполняется, появляется диалоговое окно QMessageBox. Однако, когда диалог закрывается нажатием «да» или «нет», эта функция немедленно вызывается снова, потому что я полагаю, что фокус переместился обратно в окно приложения в этой точке с ActiveWindowFocusReason. Очевидно, я не хочу, чтобы это произошло.
Аналогично, если пользователь использует диалоги открытия и закрытия приложений, окна и т. Д., Я не хочу, чтобы эта процедура активировалась. ПРИМЕЧАНИЕ: я не уверен в обстоятельствах, когда эта подпрограмма активирована, хотя, поскольку я немного попробовал, и это происходит не для всех окон и диалогов, хотя это происходит по крайней мере для того, что показано в примере кода .
Я хочу, чтобы он активировался только в том случае, если приложение сфокусировано снаружи этого приложения, а не в том случае, когда основное окно сфокусировано из других диалоговых окон.
Возможно ли это? Как это можно сделать?
Спасибо за любую информацию, так как это очень важно для нашего приложения.
Raymond.