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 

私のコードでは、テキスト変更イベントが正しく機能しています。しかし、クリックイベントが機能しません。テキスト編集ウィジェットでクリックイベントを検出するにはどうすればよいですか?

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)

アップデート

mousePressEventPyQt5 でも動作します。

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、そのマウス イベント ハンドラーの 1 つをオーバーライドし、自分でシグナルを発信する必要があります。

古いスタイルのシグナルは 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 に答える