Pergunta

Eu tenho dois aplicativos que estou desenvolvendo usando Qt no windows. Eu quero o usuário seja capaz de pressionar um botão em um aplicativo que faz com que o outro aplicativo vem para o primeiro plano. (Os programas comunicar usando QLocalSocket e pipes nomeados.)

Atualmente estou usando QWidget :: ActivateWindow do Qt () que ocasionalmente traz o aplicativo para o primeiro plano, mas na maioria das vezes ele só destaca o programa na barra de tarefas.

Alguém por favor pode me dizer como fazer isso, de preferência usando Qt embora não que o uso da API Win32 seria ótimo.


Infelizmente, eu não poderia encontrar uma maneira de fazer isso apenas com o Qt. Eu resolvi-lo usando a sugestão de Chris Becke de chamar SetForegroundWindow do aplicativo ativo no momento.

Foi útil?

Solução

Tem certeza que isso não é uma questão de depuração? O negócio é, se um aplicativo tem primeiro plano, é permitido mudar o plano.

Ao clicar em um botão na janela Um vai dar que a ativação do Windows segmento de primeiro plano. Se ele chama SetForegroundWindow (ou equivalente) na outra janela, essa janela será dado o primeiro plano.

Se, por outro lado, ele simplesmente envia uma mensagem para outro aplicativo, que tenta SetForeground sobre si mesmo, que irá falhar. AllowSetForegroundWindow é usado em situações em que um aplicativo 'legado' deve ser dada permissão - por um aplicativo de primeiro plano - para tomar o primeiro plano. Mais uma vez, AllowSet ... só funciona se for chamado a partir de um segmento que possui o atual janela em primeiro plano ativo.

Outras dicas

No topo do método QWidget::activateWindow, você deve chamar QWidget::raise!

Isto é o que é dito aqui .

Eu tenho um caso similar.

Eu tenho dois aplicativos Qt, A e B, que se comunicam em um soquete. Eu gostaria de trazer uma janela de aplicação B-se, através de um botão no aplicativo A.

Descobri que às vezes o estado do widget não está definido corretamente, por isso, a função event() da minha applicatons B do widget eu fiz o seguinte:

bool MyWidgetB:event ( QEvent * e )
{
    QEvent::Type type = e->type ();

    // Somehow the correct state of window is not getting set,
    // so doing it manually
    if( e->type() == QEvent::Hide)
    {
        this->setWindowState(WindowMinimized);
    }
    else if( e->type() == QEvent::Show )
    {
        this->setWindowState((this->windowState() & ~WindowMinimized) |
                                 WindowActive);
    }
    return QWidget::event(e);
}

Estou enviando um comando do aplicativo A para B. No recebê-lo, a aplicação B chama a seguinte função em si:

void BringUpWidget(QWidget* pWidget)
{
   pWidget ->showMinimized(); // This is to bring up the window if not minimized
                              // but beneath some other window

   pWidget ->setWindowState(Qt::WindowActive);
   pWidget ->showNormal();
}

Isso funciona para mim, sobre Windows XP , com Qt 3.3. Meu MainWidget é derivada de uma QWidget.

Eu encontrei este também está trabalhando com um widget derivado de QMainWindow, mas com alguns problemas. Como se algumas outras janelas filho estão abertas.

Para esse caso, eu armazenar a posição das janelas filho e escondê-los, em seguida, usar a função BringUpWidget para trazer meu widget MainWindow, e em seguida, restaurar as janelas filho.

Este é um tipo de queijo, mas funciona para mim:

            this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
            this->show();
            this->setWindowFlags(Qt::FramelessWindowHint);
            this->show();

Ou, se você não tem outras bandeiras,

            this->setWindowFlags(Qt::WindowStaysOnTopHint);
            this->show();
            this->setWindowFlags(0);
            this->show();

WindowStaysOnTopHint quase sempre forçar a janela para o primeiro plano. Depois, você realmente não quer que a janela sempre permanecer no topo, então redefinir a tudo o que as bandeiras anteriores foram.

Eu acho que as APIs que você precisa são AllowSetForegroundWindow () e SetForegroundWindow () . Eu não sei o que as chamadas Qt equivalentes são.

Use SHOWNORMAL () para ir de um estado iconified para um estado visível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top