2

我班上有这样的代码

 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 小部件中的点击事件?

4

2 回答 2

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 测试。(窗口 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)测试

于 2013-09-08T14:54:59.227 回答
0

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

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

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

使用旧式信号,信号在发出时被隐式定义,因此在调用时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_()
于 2013-09-08T14:40:18.920 回答