Ответ 1
Менеджер Windows решает
Прежде чем начать: как указано elcuco и Хавьер, политика фокусировки и другие аспекты макет окна (например, строка заголовка) относится к существенному расширению для соответствующего менеджера окон, а Qt может иметь ограниченный контроль. Чтобы увидеть это, просто посмотрите на пользовательский интерфейс, в котором есть " focus follow mouse". В этих случаях диспетчер окон может игнорировать запрос фокуса Qt. По этой причине документация Qt вызывает многие соответствующие флаги "подсказки". Следовательно, некоторые из предлагаемых решений могут или не могут работать для вас.
QApplication:: SetActiveWindow()
Это не выдерживает, решение e.tadeu использовать QApplication::setActiveWindow()
работает для меня как для Windows, так и для Ubuntu с Gnome. Я проверил его со следующим кодом. Извиняется, что это Python с использованием PyQt (я использую такие вопросы, чтобы узнать немного о PyQt). Вам должно быть довольно легко прочитать его и перевести на С++.
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
.
Файл grabKeyboard() 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 должен быть таким же. Также не рекомендуется.