Windows マネージャーが決定します
始める前に: elcucoとJavierが指摘したように、フォーカス ポリシーとウィンドウ レイアウトのその他の側面 (タイトル バーなど) は、それぞれのウィンドウ マネージャーに実質的に属しており、Qt は制御が制限されている可能性があります。これを確認するには、「フォーカスはマウスに従う」ポリシーを持つユーザー インターフェイスを見てください。このような場合、Windows マネージャーは Qt のフォーカス要求を無視する可能性があります。このため、Qt のドキュメントでは、それぞれのフラグの多くを「ヒント」と呼んでいます。その結果、提案された解決策の一部が機能する場合と機能しない場合があります。
QApplication::setActiveWindow()
これに関係なく、e.tadeuの使用するソリューションQApplication::setActiveWindow()
は、WindowsとGnomeを使用したUbuntuの両方で機能します。次のコードでテストしました。PyQt を使用した Python であることをお詫びします (このような質問を使用して、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
を閉じてもアプリは自動的に終了しないため、の close イベントの処理を追加する必要があることに注意してください。Qt::Tool
grabKeyboard()ハック
これがうまくいかない場合は、次のハックが考えられます。アプリケーションにアクティブなウィンドウがあるとします。その後、 を使用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
とスタイルのあるウィンドウを表示します。を必要なものに簡単に置き換えることができます。Linuxも同じはずです。明らかに推奨されていません。WS_EX_TOOLWINDOW
Qt::Tool
SW_SHOWNOACTIVATE