我的课程中有这样的代码
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小部件中检测点击事件?
答案 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_()