【问题标题】:Python PyQt event not ignoredPython PyQt 事件未被忽略
【发布时间】:2018-01-20 05:39:55
【问题描述】:

我在我的代码中使用典型的子类对 qtextedit 进行了子类化,但不知何故,即使我的信号工作正常,event.ignore 也不会工作。目标是抓住输入键并单击按钮,但不提交 qtextedit 上的输入。

我的代码在这里:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QAction
from PyQt5.QtGui import QPalette
from PyQt5.QtCore import QThread , pyqtSignal

class Text_Edit(QtWidgets.QTextEdit):
    keyPressed = QtCore.pyqtSignal(QtCore.QEvent)
    keyPressed2 = pyqtSignal()

    def __init__(self, parent=None):
        super(Text_Edit, self).__init__(parent)
        self.setGeometry(QtCore.QRect(30, 100, 331, 71))
        self.setStyleSheet("font: 10pt \"MS Shell Dlg 2\";")
        self.raise_()
        self.setFocus()
        self.setPlaceholderText("Set 4 character ICAO Locator here , divided by spaces...")
        self.keyPressed.connect(self.on_key)


    def keyPressEvent(self,event):
        super(Text_Edit, self).keyPressEvent(event)
        self.keyPressed.emit(event) 

    def on_key(self, event):
        if event.key() == QtCore.Qt.Key_Return or event.key() == QtCore.Qt.Key_Enter:
            event.ignore()
            self.keyPressed2.emit()


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1371, 924)
        MainWindow.setAcceptDrops(True)


        self.T_aerodromes_input = Text_Edit(self.centralWidget)
        self.T_aerodromes_input.keyPressed2.connect(self.B_aerodrome_data.click)

        self.B_aerodrome_data = QtWidgets.QPushButton(self.centralWidget)
        self.B_aerodrome_data.setGeometry(QtCore.QRect(670, 100, 271, 41))
        self.B_aerodrome_data.setObjectName("B_aerodrome_data")

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 你想让QKeyEvent事件不触发清理QTextEdit占位符的任务,而是激活按下按钮的效果吗?
  • 如果要回车不进入QTextEdit去掉super(Text_Edit, self).keyPressEvent(event)
  • 现在所有键都被禁用了..,但是输入工作正常
  • 看我的回答..
  • 您可能想查看doc.qt.io/qt-5/qobject.html#installEventFilter 以了解另一种(更通用)实现您想要的行为的方式

标签: python pyqt pyqt5


【解决方案1】:

如果您只想过滤输入或返回键,则只需验证它们不是那些键,如果它们不是那些键,则调用父亲的方法,否则不要这样做。

def keyPressEvent(self,event):
    if event.key() not in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
         super(Text_Edit, self).keyPressEvent(event)
    else:
         self.keyPressed.emit(event) 

【讨论】:

  • 我无法清楚地理解为什么我的方法不起作用,但这很好。
  • 是您忽略了与父亲使用的事件不同的事件,当您通过 super(Text_Edit, self).keyPressEvent(event) 传递事件时,会生成一个副本,即在内部传递,因此使用父亲的事件是您忽略的副本。
猜你喜欢
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
相关资源
最近更新 更多