2013-01-02 3 views
0

У меня есть окно, содержащее несколько QRowWidget s, которые являются пользовательскими виджетами, определенными мной. Эти QRowWidget s содержат QLineEdit s и другие стандартные виджеты. Чтобы показать или скрыть определенные части QRowWidget, я переопределил методы focusInEvent() всех виджетов внутри него. Он отлично работает, когда я нажимаю на QRowWidget, появляются скрытые элементы.курсор ушел в PyQT

Странно, что мигающий курсор строки hoverwer не отображается в QLineEdit в пользовательских виджетах. Я могу выбрать их как щелчком мыши, так и с вкладкой, а эффект свечения указывает, что в нем выбран QLineEdit, я могу выбрать текст в нем или начать вводить текст в любом месте, где бы я ни находился, но курсор никогда не появляется и это довольно раздражает.

Моя первая мысль заключалась в том, что это ошибка на Mac, но у меня такой же опыт на SuSe Linux.

Я использую python 2.7 и PyQt4.

Это в __init__() в QRowWidget:

for i in self.findChildren(QWidget): 
     i.focusInEvent = self.focusInEvent 

И тогда это собственное focusInEvent():

def focusInEvent(self, event): 
    if self.pself.focusedLine: 
     self.pself.focusedLine.setStyleSheet("color: #666;") 
     self.pself.focusedLine.desc.hide() 
     self.pself.focusedLine.closebutton.hide() 
    self.setStyleSheet("color: #000;") 
    self.desc.show() 
    self.closebutton.show() 
    self.pself.focusedLine = self 
+0

Можете ли вы опубликовать код вашего 'focusInEvent()'? Я ответил на догадку, но показывая, что именно вы делаете, вы получите лучшие ответы. – tacaswell

ответ

1

Я подозреваю, что вы не делаете вызов к исходному focusInEvent() при коррекции Это. Ваша функция должна выглядеть примерно так:

def focusInEvent(self,...): 
    QParent.focusInEvent(self,...) 
    # the rest of your code 

QParent, где находится ближайший базовый класс для виджетов.

Либо это, либо не забудьте позвонить focusInEvent() на свои QLineEdit виджеты как часть вашей функции.

Учитывая комментарии, похоже, что вы динамически переназначаете функцию focusInEvent на insantiatations в своем пользовательском виджете. Я бы либо сделать производный класс для каждого из виджетов вы используете это только переопределяет focusInEvent, как указано выше, или включают в себя строку

type(self).focusInEvent(self,..) 

в вас работать.

+0

Что я делаю, так это то, что я повторяю все дочерние элементы пользовательского виджета и перезаписываю все их методы focusInEvent(). Как я могу по-прежнему вызывать исходные методы? – Mkoch

+0

«focusInEvent», который вы установили на них, должен сделать звонок к оригиналу. Я сильно подозреваю, что это вызов, который помещает мигающий курсор в поля 'QLineEdit'. – tacaswell

+0

Хорошо, но с одной стороны мне нужно переопределить функцию, чтобы делать свои собственные вещи, с другой стороны мне все еще нужно вызвать исходную функцию. Как я могу это сделать? (Я думаю, что поймать те же события, что и focusInEvent, будет одним из способов, но есть ли более увлекательный?) – Mkoch