Question

I have a window containing multiple QRowWidgets, which are custom widgets defined by me. These QRowWidgets contain QLineEdits and other standard widgets. To show or hide certain parts of a QRowWidget, I overdefined the focusInEvent() methodes of all the widgets within it. It works perfectly, when I click on the QRowWidget, the hidden elements appear.

The weird thing is that the blinking cursor line hovewer doesn't appear in the QLineEdits within the custom widgets. I can select them both by a mouse click or with Tab, and a glow effect indicates that the QLineEdit is selected in it, I can select a text in it, or start typing at any location wherever I clicked, but the cursor never appears and it's quite annoying.

My 1st thought was that it is a bug on Mac, but I have the same experience on SuSe Linux.

I'm using python 2.7 and PyQt4.

This is in the __init__() of the QRowWidget:

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

And then this is the own 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
Was it helpful?

Solution

I suspect you do not make a call to the original focusInEvent() when you override it. Your function should look something like:

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

where QParent is the nearest base class for your widgets is.

Either that, or make sure you call focusInEvent() on your QLineEdit widgets as part of your function.

Given the comments, it sounds like you are dynamically reassigning the focusInEvent function on the insantiatations in your custom widget. I would either make a derived class for each of the widgets you use that just overrides focusInEvent as above, or include a line like

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

in you function.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top