Pergunta

eu tenho um QMainWindow. Tem estes parâmetros:

this->setWindowFlags(Qt::Tool);
this->setFocusPolicy(Qt::StrongFocus);
this->setAttribute(Qt::WA_QuitOnClose,true);

Depois de MostrarEvento calles minha janela é mostrado, mas não activado. Tentei sobrecarga show de função:

...    
QMainWindow::showEvent(event);
this->activateWindow();
...

Mas não me ajuda.

EDIT: Quando eu comentou linha

this->setWindowFlags(Qt::Tool);

tudo funcionou bem, mas eu preciso na ferramenta de bandeira. Alguma idéia?

EDIT:

  • OS: Linux
  • linguagem de programação: C ++
  • versão Qt: 4.5.1
Foi útil?

Solução

O Windows Gerenciador Decide

Antes de começar: Como apontado por elcuco e Javier , a política de foco e outros aspectos do layout de janelas (por exemplo, a barra de título) pertence a um substancial estender a o respectivo gestor de janelas, e Qt pode ter controle limitado. Para ver isto, basta olhar para uma interface de usuário que tem um " foco segue mouse " política. Nestes casos, o gerenciador de janelas pode ignorar pedido foco da Qt. Por esta razão, a documentação Qt chama muitas das bandeiras respectivos "dicas". Consequentemente, algumas das soluções sugeridas pode ou não funcionar para você.

QApplication :: SetActiveWindow ()

Isto não obstante, de e.tadeu solução para uso QApplication::setActiveWindow() funciona para mim, tanto para Windows e Ubuntu com Gnome. Eu testei com o código seguinte. Desculpas que é Python usando PyQt (eu uso perguntas como estas para aprender um pouco sobre PyQt). Deve ser razoavelmente fácil para você lê-lo e traduzi-lo em C ++.

import sys

from PyQt4 import QtGui
from PyQt4 import QtCore

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self)

        # main window
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Test')

        # text editor
        self.textEdit = QtGui.QTextEdit()
        self.setCentralWidget(self.textEdit)

    def closeEvent(self, event):
        QtGui.QApplication.instance().quit()

#main
app = QtGui.QApplication(sys.argv)
testWindow = MainWindow()
testWindow.setWindowFlags(QtCore.Qt.Tool)
testWindow.show()
app.setActiveWindow(testWindow)
app.exec_()

Note que você tem que adicionar um pouco de manipulação do próximo evento do testWindow, porque o aplicativo não sair automaticamente se você fechar uma janela Qt::Tool.

O grabKeyboard () hack

Se isso não funcionar para você, a seguir pode hack. Eu supor que você tem uma janela no seu aplicativo que está ativo. então você pode usar grabKeyboard() para redirecionar a entrada. A janela Qt::Tool não recebe o foco, mas recebe a entrada. O código principal a seguir demonstra isso (o outro código permanece inalterado).

#main
app = QtGui.QApplication(sys.argv)
testWindow = MainWindow()
testWindow.setWindowFlags(QtCore.Qt.Tool)
testWindow2 = MainWindow()   # second window which is active
testWindow2.show()
testWindow.show()
testWindow.textEdit.grabKeyboard()
app.exec_()

Basicamente, enquanto o testWindow2 janela é o ativo, todo o texto digitado aparece em testWindow.textEdit. Não é agradável, eu sei ...

Criar o seu próprio Janela

Você ganha mais flexibilidade (e criar mais trabalho para si mesmo) por lançando seu próprio layout da janela. A idéia é descrito no seguinte FAQ .

Outros "Soluções"

Você pode chamar diretamente a função API do respectivo gerenciador de janelas para obter o resultado desejado (claramente contra a própria razão para usar Qt, em primeiro lugar). Você também pode cortar o código fonte Qt. Por exemplo, no Windows, Qt usa o ShowWindow() função com uma bandeira SW_SHOWNOACTIVATE, para mostrar uma janela com estilo WS_EX_TOOLWINDOW Se você definir o sinalizador Qt::Tool. Você poderia facilmente substituir o SW_SHOWNOACTIVATE com o que quiser. Linux deve ser o mesmo. Claramente, também não é recomendado.

Outras dicas

Tente usar QApplication :: SetActiveWindow ()

O original da Apple Human Interface Guidelines (*) disse que as janelas da caixa de ferramentas eram "sempre no topo, mas nunca ativada". Ele também desaconselha o uso de caixas de texto sobre eles, precisamente por causa da falta de feedback à activação do estado.

Veja como outra 'caixa de ferramentas pesado' de aplicativos se comportam. I vagamente lembrar que, pelo menos, GIMP e InkScape parece muito diferente neste aspecto.

Como elcuco disse, o gerenciador de janelas pode fazer o que quiser com bandeiras do Qt . Além disso, com certeza seria diferente no KDE, Gnome, Fluxbox, seja qual for.

(*): great documento! um pouco ultrapassada; mas janelas de ferramentas já foram utilizados e considerados

Qual sistema operacional? Que Qt4?

No Linux você está condenado, o gerenciador de janelas pode ignorar o que você está dizendo a ele. Mantê-lo em consideração.

A mesma coisa acontece se você apenas torná-lo um QWidget regular em vez de um QMainWindow?

Além disso, talvez você possa ser melhor tentar alcançar qualquer efeito que você precisa Qt :: Ferramenta para por outros meios se isso é possível?

Em relação Citação Qt :: Ferramenta WindowFlags Para documentação Qt

Indica que o widget é uma ferramenta janela. A janela de ferramenta é muitas vezes um pequeno com uma janela mais pequena do que o habitual título bar e decoração, tipicamente usado para coleções de botões de ferramentas. -lo lá é um pai, a vontade janela de ferramenta ser mantidos sempre em cima dela. Se lá não é um pai, você pode considerar o uso de Qt :: WindowStaysOnTopHint também. E se o sistema de janelas suporta, uma ferramenta janela pode ser decorado com uma estrutura um pouco mais leve. Ele também pode ser combinado com Qt :: FramelessWindowHint

Parece que as bandeiras é um problema e usando Qt :: WindowStaysOnTopHint deve resolver o seu problema.

show() Apenas chamada após setWindowFlags().

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