2010-12-17 13 views
5

ボタンをダブルクリックすると、そのボタンのテキストを編集できるカスタムQtボタンを作成しています。ボタンをダブルクリックすると、QLineEditが表示され、ボタン上のテキストによってボタン上のテキストを編集できます。私の要件は、ユーザーがアプリケーションウィンドウ内のどこかをクリックすると、QLineEditが消えて編集操作がキャンセルされるということです。これは場合によっては機能します。具体的には、テキスト入力が可能なものをクリックすると動作します。ウィンドウの他の部分が期待通りに機能しません。アプリケーションウィンドウの空白部分をクリックすると、QLineEditはそのフォーカスを保持します。このような場合、どうすればその焦点を取り除くことができますか?QLineEditからQLineEditのフォーカスを削除する方法

答えて

8

私はまだ動作しているようですが、他のオプションがある場合はまだ開いていますが、解決策を見つけました。私はPyQt4を使用していますので、私の例はPythonで書かれています:

新しいタイプがあるので、QLineEditのサブクラスを作成してください。私はすべてのQLineEditインスタンスでこの動作を必要としたくないです。これらの特定のものだけ。

class MyLineEdit(QtGui.QLineEdit): 
    pass 

私のQMainWindowサブクラスでは、mousePressEvent()の実装よりも優先されます。現在フォーカスのあるウィジェットを取得します。そのウィジェットのタイプがMyLineEditの場合は、フォーカスをクリアします。

class MyMainWindow(QtGui.QMainWindow): 
    def ... 

    def mousePressEvent(self, event): 
     focused_widget = QtGui.QApplication.focusWidget() 
     if isinstance(focused_widget, MyLineEdit): 
      focused_widget.clearFocus() 
     QtGui.QMainWindow.mousePressEvent(self, event) 

    def ... 

ユーザーがアプリケーションのウィンドウの任意の場所をクリックすると、フォーカスがクリアされるように、これは私に求めている動作を取得します。


編集:これには1つの注意点があります。私はQTreeViewをメインウィンドウに持っています。ユーザーがツリービューをクリックすると、テキスト編集フィールドからフォーカスが削除されません。

+0

+1 'clearFocus()'は私が必要としたものです。ありがとう! –

4

親ウィジェットのclicked()シグナルをキャッチし、yourLabel->clearFocus()(残念ながらスロットではないので状況がより複雑になります)を呼び出します。

+1

yourLabel-> clearFocus()を呼び出す独自のスロットを定義することはあまり複雑ではありません。 :) – Exa

+1

残念なことに、これは、含まれているウィジェットの内部をクリックした場合にのみ機能します。必要に応じて、他の多くのウィジェットを含むウインドウ上の他の場所ではありません。 –

2

私はここグラントLimberg命令に従ったが、私の場合には、簡単なことを考え出し:

QApplication.focusWidget().clearFocus() 

は、問題を修正します。私はおそらく、editingFinished()代わりのreturnPressed()を使用しますが、私はtextChanged(QString)を使用していないだろう。この特定のケースでは

connect(myWidgets->MyLineEdit, SIGNAL(returnPressed()), this, SLOT(onLineEditDone()); 

void onLineEditDone() 
{ 
    myWidgets->MyLineEdit->clearFocus(); 
} 

:Cにすれば

0

は++私はの線に沿って何かをするだろう。