点击事件不在pyside的textedit工作

时间:2013-09-08 13:53:10

标签: python pyqt4 pyside

我的课程中有这样的代码

 self.textEdit = QtGui.QTextEdit(self.centralwidget)
 self.textEdit.setGeometry(QtCore.QRect(30, 20, 351, 51))
 self.textEdit.setObjectName("textEdit")
 QtCore.QObject.connect(self.textEdit, QtCore.SIGNAL("clicked()"), self.text_click)
 QtCore.QObject.connect(self.textEdit, QtCore.SIGNAL("textChanged()"), self.text_change)
 def text_change(self):
     print "change ok"
 def text_click(self):
     print "clicked ok 

在我的代码文本中,更改事件正常工作。但点击事件不起作用。 如何在textedit小部件中检测点击事件?

2 个答案:

答案 0 :(得分:3)

我不确定这是正确的方法。您可以使用mousePressEvent

import sys
from PyQt4 import QtGui, QtCore

def text_change():
    print "change ok"
def text_click(event): # <--- NOTE: event object is passed.
    print "clicked ok "

app = QtGui.QApplication(sys.argv)
textEdit = QtGui.QTextEdit()
textEdit.setGeometry(QtCore.QRect(30, 20, 351, 51))
textEdit.setObjectName("textEdit")
textEdit.mousePressEvent = text_click
QtCore.QObject.connect(textEdit, QtCore.SIGNAL("textChanged()"), text_change)
textEdit.show()
sys.exit(app.exec_())

使用PyQt 4.10.2进行测试。 (Window 7,Python 2.7.5)

<强>更新

mousePressEvent也适用于PyQt5。

import sys
from PyQt5 import QtCore, QtWidgets

def text_change():
    print("change ok")
def text_click(event):
    print("clicked ok ")

app = QtWidgets.QApplication(sys.argv)
textEdit = QtWidgets.QTextEdit()
textEdit.setGeometry(QtCore.QRect(30, 20, 351, 51))
textEdit.setObjectName("textEdit")
textEdit.mousePressEvent = text_click
textEdit.textChanged.connect(text_change)
textEdit.show()
sys.exit(app.exec_())

使用PyQt 5.0(Windows 7,Python 3.3.2)进行测试

答案 1 :(得分:0)

如果您阅读QTextEdit的文档,则会注意到没有 clicked信号。

如果您使用new style signals,您会更早发现此类错误,因为您无法以这种方式连接不存在的信号,您会收到错误:

>>> self.textEdit.clicked.connect(...)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'QTextEdit' object has no attribute 'clicked'

使用old style signals,信号在发出时会隐式定义,因此在调用QObject.connect时,不会检查信号是否真的存在。

如果您希望QTextEdit发出clicked信号,则需要覆盖其中一个鼠标事件处理程序并自行发出信号。

老式的信号将在PyQt5中消失,所以你应该真正习惯新的风格信号。


编辑 - 如何在从QTextEdit派生的类上定义点击信号的简单示例:

from PyQt4.QtGui import QApplication, QTextEdit
from PyQt4.QtCore import pyqtSignal

class TextEdit(QTextEdit):
    clicked = pyqtSignal()
    def mouseReleaseEvent(self, event):
        self.clicked.emit()

if __name__ == '__main__':
    app = QApplication([])
    textEdit = TextEdit()
    textEdit.clicked.connect(lambda: print('clicked'))
    textEdit.show()
    app.exec_()