2013-01-02 50 views
0

我有一个窗口包含多个QRowWidget s,这是我定义的自定义窗口小部件。这些QRowWidget包含QLineEdit和其他标准小部件。要显示或隐藏某个QRowWidget的某些部分,我重新定义了其中所有小部件的方法focusInEvent()。它完美的工作,当我点击QRowWidget,隐藏的元素出现。光标已在PyQT

奇怪的是,闪烁的光标行hovewer不出现在自定义小部件中的QLineEdit中。我可以通过鼠标点击或使用Tab键来选择它们,并且发光效果表示在其中选择了QLineEdit,我可以在其中选择一个文本,或者在任何我点击的位置开始输入,但是光标永远不会出现并且这很烦人。

我的第一个想法是,这是一个Mac上的错误,但我在SuSe Linux上有相同的经验。

我正在使用python 2.7和PyQt4。

这是QRowWidget__init__()

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最近的基类,你的部件是。

要么是这样,要么确保您的QLineEdit小部件上的focusInEvent()作为您的函数的一部分。

给出评论,这听起来像你动态地重新分配你的自定义小部件insantiatations上的focusInEvent函数。我想要么使每个小部件的使用派生类只覆盖focusInEvent如上,或者包括像

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

在你发挥作用的线。

+0

我所做的是迭代自定义小部件的所有子元素,并覆盖其所有'focusInEvent()'方法。我怎样才能继续调用原始方法? – Mkoch

+0

您在其上设置的'focusInEvent'需要打电话给原件。我强烈怀疑这是将闪烁的光标置于“QLineEdit”框中的调用。 – tacaswell

+0

好的,但一方面我需要重写函数来做我自己的东西,另一方面我仍然需要调用原始函数。我怎样才能做到这一点? (我猜想像focusInEvent一样捕获相同的事件会是一种方式,但是会有更多的方便吗?) – Mkoch