Менеджер Windows решает
Перед тем, как начать: Как отмечают elcuco и Хавьер , политика фокуса и другие аспекты компоновки окон (например, строка заголовка) в значительной степени относятся к соответствующим менеджер окон, и Qt может иметь ограниченный контроль. Чтобы увидеть это, просто взгляните на пользовательский интерфейс, который имеет политику « focus следует мыши ». В этих случаях менеджер окон может игнорировать запрос фокуса Qt. По этой причине в документации Qt многие соответствующие флаги называются «подсказками». Следовательно, некоторые из предложенных решений могут работать или не работать для вас.
QApplication :: SetActiveWindow ()
Это не выдерживает, решение e.tadeu по использованию QApplication::setActiveWindow()
работает для меня как для Windows, так и для Ubuntu с Gnome. Я проверил это с помощью следующего кода. Извиняюсь, что это Python, использующий PyQt (я использую подобные вопросы, чтобы немного узнать о PyQt). Вам должно быть довольно легко прочитать его и перевести на 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_()
Обратите внимание, что вам нужно добавить некоторую обработку события закрытия testWindow
, потому что приложение не закрывается автоматически, если вы закрываете окно Qt::Tool
.
Захват для клавиатуры () Hack
Если это не сработает для вас, возможно, следующий хак. Я предполагаю, что у вас есть окно в вашем приложении, которое активно. Затем вы можете использовать grabKeyboard()
для перенаправления ввода. Окно Qt::Tool
не получает фокус, но получает ввод. Следующий основной код демонстрирует это (другой код остается неизменным).
#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_()
Обычно, когда окно testWindow2
является активным, весь введенный текст отображается в testWindow.textEdit
. Это не приятно, я знаю ...
Создание собственного окна
Вы получаете наибольшую гибкость (и создаете больше работы для себя), разворачивая свой собственный макет окна. Идея описана в следующем FAQ .
Другие "Решения"
Вы можете напрямую вызвать API-функцию соответствующего оконного менеджера, чтобы получить желаемый результат (явно против самой причины использования Qt в первую очередь). Вы также можете взломать исходный код Qt. Например, в Windows Qt использует функцию ShowWindow()
с флагом SW_SHOWNOACTIVATE
, чтобы показать окно со стилем WS_EX_TOOLWINDOW
, если вы установите флаг Qt::Tool
. Вы можете легко заменить SW_SHOWNOACTIVATE
на что угодно. Linux должен быть таким же. Понятно также не рекомендуется.