2010-12-17 136 views
5

我正在研究一個自定義Qt按鈕,該按鈕允許您在雙擊按鈕時編輯該按鈕上的文本。當按鈕被雙擊時,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 ... 

這讓我我在尋找這樣如果用戶點擊應用程序的窗口上的任何地方,重點是清除行爲。


編輯:我沒有找到一個警告。我在主窗口中有一個QTreeView。如果用戶單擊樹視圖,則焦點不會從文本編輯字段中移除。

+0

+1'clearFocus()'是我所需要的。謝謝! – 2012-03-28 15:37:25

4

抓住你的父裝飾件的clicked()信號,並打電話yourLabel->clearFocus()(不幸的是,它不是一個插槽,使事情更復雜)。

+1

定義一個你自己調用yourLabel-> clearFocus()的槽不應該太複雜。 :) – Exa 2010-12-17 13:10:53

+1

不幸的是,只有當你在包含的小部件內部單擊時纔有效。根據我的需要,並非包含許多其他小部件的窗口中的任何其他位置。 – 2010-12-17 16:53:18

2

我跟着格蘭特Limberg指令在這裏,但想通了,在我的情況下,簡單:

QApplication.focusWidget().clearFocus() 

會解決這個問題。

0

如果用C++做我會做線沿線的東西:

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

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

因爲我會用editingFinished()代替returnPressed(),或許這種特殊情況下,但我不會用textChanged(QString)

相關問題