14

私は 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: リナックス
  • プログラミング言語: c++
  • Qt バージョン: 4.5.1
4

7 に答える 7

14

Windows マネージャーが決定します

始める前に: elcucoJavierが指摘したように、フォーカス ポリシーとウィンドウ レイアウトのその他の側面 (タイトル バーなど) は、それぞれのウィンドウ マネージャーに実質的に属しており、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_TOOLWINDOWQt::ToolSW_SHOWNOACTIVATE

于 2009-07-07T21:29:39.823 に答える
4

QApplication::setActiveWindow() を使用してみてください

于 2009-07-03T20:22:08.307 に答える
4

元の Apple ヒューマン インターフェイス ガイドライン(*) では、ツールボックス ウィンドウは「常に最前面に表示されるが、アクティブ化されない」と記載されていました。また、アクティブ化状態のフィードバックがないため、テキスト ボックスを使用しないようにアドバイスしています。

他の「ツールボックスが重い」アプリの動作を確認してください。少なくとも GIMP と InkScape はこの点で非常に異なっているように見えることをかすかに思い出します。

elcucoが言ったように、ウィンドウ マネージャは Qt のフラグを使って何でもできます。また、KDE、Gnome、fluxbox など、どのような環境でも確実に異なります。

(*):素晴らしいドキュメントです! やや時代遅れです。ツールウィンドウはすでに使用され、考慮されていました

于 2009-07-03T23:07:45.763 に答える
0

show()の後に呼び出すだけsetWindowFlags()です。

于 2010-04-12T10:01:15.567 に答える
0

Qt::Tool WindowFlags について Qt のドキュメントを引用するには

ウィジェットがツール ウィンドウであることを示します。ツール ウィンドウは、多くの場合、通常よりも小さなタイトル バーと装飾を備えた小さなウィンドウであり、通常はツール ボタンのコレクションに使用されます。親がある場合、ツール ウィンドウは常にその上に表示されます。親がない場合は、Qt::WindowStaysOnTopHint の使用も検討できます。ウィンドウ システムがそれをサポートしている場合、ツール ウィンドウをやや軽いフレームで装飾できます。Qt::FramelessWindowHint と組み合わせることもできます

フラグに問題があるようで、 Qt::WindowStaysOnTopHint を使用すると問題が解決するはずです。

于 2009-07-04T09:00:14.970 に答える