質問
QMainWindowがあります。これには次のパラメータがあります。
this->setWindowFlags(Qt::Tool); this->setFocusPolicy(Qt::StrongFocus); this->setAttribute(Qt::WA_QuitOnClose,true);
showEvent が呼び出された後、ウィンドウは表示されますが、アクティブ化されません。show 関数をオーバーロードしようとしました:
...
QMainWindow::showEvent(event);
this->activateWindow();
...
でもそれは役に立ちません。
編集:ラインにコメントしたとき
this->setWindowFlags(Qt::Tool);
すべてうまくいきましたが、ツールフラグが必要です。何か案は?
編集:
- OS:Linux
- プログラミング言語:C++
- Qtのバージョン:4.5.1
解決
Windows マネージャーが決定する
始める前に:が指摘したように、 エルクコ そして ハビエル, 、フォーカス ポリシー、およびウィンドウ レイアウトのその他の側面 (例:タイトル バー) はそれぞれの Windows マネージャーの実質的な拡張に属しており、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_()
の close イベントの処理を追加する必要があることに注意してください。 testWindow
, を閉じてもアプリは自動的に終了しないため、 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
. 。それは良くないことだとわかっています...
独自のウィンドウを作成する
独自のウィンドウ レイアウトを展開することで、最大限の柔軟性が得られます (また、最大限の作業を自分で作成できます)。その考え方は以下で説明されています よくある質問.
その他の「ソリューション」
それぞれのウィンドウ マネージャーの API 関数を直接呼び出して、目的の結果を得ることができます (そもそも Qt を使用する理由に明らかに反しています)。Qt ソース コードをハッキングすることもできます。たとえば、Windows では、Qt は ShowWindow()
を使用した関数 SW_SHOWNOACTIVATE
フラグ、スタイルを指定してウィンドウを表示する WS_EX_TOOLWINDOW
を設定した場合 Qt::Tool
フラグ。簡単に交換できます SW_SHOWNOACTIVATE
あなたが望むものは何でも。Linuxも同じはずです。これも明らかに推奨されません。
他のヒント
使用してみてくださいはQApplication :: setActiveWindow()
元アップルヒューマンインターフェイスガイドライン(*)ツールボックスウィンドウが「一番上に常にますが起動したことがない」だったと述べました。また、正確に活性化状態フィードバックの欠如ので、それらの上にテキストボックスを使用しないことをアドバイスします。
他の「ツールボックス重い」アプリがどのように動作するか確認してください。私はかすかに少なくともGIMPとInkscapeは、この局面では非常に異なるように見えることを思い出します。
elcuco には、ウィンドウマネージャが、それはQtの旗を望んでいるものは何でも行うことができますが、言ったように。また、確かfluxboxの、KDE、Gnomeの下では異なるだろう、どんなます。
(*):偉大なドキュメント!やや時代遅れ。しかし、ツールウィンドウがすでに使用して考えられた。
どのオペレーティングシステム?どのQt4を?
Linuxでは、あなたが運命にある、ウィンドウマネージャは、あなたが彼に言っているものを無視することができます。検討の下でそれをしてくださいます。
あなたはそれの代わりにQMainWindowの定期的なQWidgetの作れば同じことが起こるのでしょうか?
また、おそらくあなたはそれが可能だ場合は、他の手段でのためのQt ::ツールを必要とするものは何でも効果を達成しようとしている方がよいのでしょうか?
Qtのドキュメントを引用するとQtの::ツールWindowFlagsについて
ウィジェットはツールであることを示します 窓。ツールウィンドウは、多くの場合、小さいです 通常よりも小さいタイトルを持つウィンドウ バーや装飾、一般的に使用 ツールボタンのコレクション。そこ 親、ツールウィンドウの意志であります 常にその上に保持します。もしそこにあるなら 親ではありません、あなたが使用して検討すること 同様のQt :: WindowStaysOnTopHint。もし ウィンドウシステムは、ツールを、それをサポートしています ウィンドウが飾らすることができます やや軽いフレーム。また、することができ Qtの:: FramelessWindowHintと組み合わせる
フラグが問題であるとQt :: WindowStaysOnTopHintはあなたの問題を解決する必要があります使用しているようだ。
ただ、show()
の後setWindowFlags()
を呼び出します。