Я создал два QPushButton на двух разных QMainWindow. Я назначаю фокус на них случайным образом через определенный интервал. Вот код.
int main(int argc, char **argv){
QApplication a(argc, argv);
QMainWindow *win1= new QMainWindow();
win1->resize(567,578);
win1->move(67,30);
win1->show();
QMainWindow *win2= new QMainWindow();
win2->resize(567,578);
win2->move(97,580);
win2->show();
win1->show();
//win2->setModal(true);
QPushButton *but1 = new QPushButton(win1);
but1->resize(80,20);
but1->move(100,100);
but1->setText("1");
but1->show();
QPushButton *but2 = new QPushButton(win2);
but2->resize(80,20);
but2->move(100,300);
but2->setText("2");
but2->show();while(1){
if((rand()%2) == 1){
//win2->lower();
win1->raise();
win1->activateWindow();
win1->setWindowState(Qt::WindowActive);
win1->setFocus(Qt::ActiveWindowFocusReason);
but1->setFocus(Qt::ActiveWindowFocusReason);
}
else{
//win1->lower();
win2->raise();
win2->activateWindow();
win2->setFocus(Qt::ActiveWindowFocusReason);
but2->setFocus(Qt::ActiveWindowFocusReason);
}
qApp->processEvents(0x00);
sleep(2);
}
Но проблема в том, что строка заголовка первого окна не меняет цвет (обычно помещение окна назад-вперед через визуальный стек изменяет цвет строки заголовка), даже когда оно визуально стало верхним окном
Вы получите желаемое поведение, если измените свой последний цикл на нечто подобное:
while (1) {
// Exits if both windows are closed
if (!win1->isVisible() && (!win2->isVisible())) {
return 0;
}
// Eventually changes the focus, if the desired window is still visible
if((rand() % 2) == 1) {
if (win1->isVisible()) {
QApplication::setActiveWindow(win1);
}
}
else {
if (win2->isVisible()) {
QApplication::setActiveWindow(win2);
}
}
QTime now;
now.start();
do {
qApp->processEvents(0x00);
} while (now.elapsed() < 2000);
}
В любом случае, если вы переведете вашу программу в спящий режим, она не будет реагировать на ввод пользователя в течение этого интервала, поэтому будьте осторожны.
Реализация довольно уродливая, но она проверяет, все ли видимые окна все еще видны (то есть пользователь не закрыл их), и в конце концов закрывается, если оба были закрыты.
Конечно, я полагаю, что вы интересовались только SetActiveWindow () вещь, поэтому я не потратил много времени на написание чего-то прекрасного!
Других решений пока нет …