【问题标题】:PyQt QLineEdit and 'paste' event?PyQt QLineEdit 和“粘贴”事件?
【发布时间】:2018-04-07 06:21:22
【问题描述】:

我到处搜索,但找不到在 PyQt4 QLineEdit 中粘贴文本时触发插槽/事件的示例?

【问题讨论】:

  • Qt 中没有粘贴信号或事件。您可以使用textChanged 信号并使用QClipboard 类检查新内容是否与剪贴板内容相同。

标签: python qt pyqt pyqt4


【解决方案1】:

将以下代码添加到您的 MyForm 类中:

内部__init__()

self.ui.lineEdit_URL.textChanged.connect(self.valueChanged)

定义新方法:

def valueChanged(self, text):
     if QtGui.QApplication.clipboard().text() == text:
         self.pasteEvent(text)

定义另一个方法:

def pasteEvent(self, text):
    # this is your paste event, whenever any text is pasted in the
    # 'lineEdit_URL', this method gets called.
    # 'text' is the newly pasted text.

    print text

【讨论】:

  • FWIW,在我看来,只要行编辑的文本 更改(例如键盘按键),就会调用这个 pasteEvent。这与仅在发短信粘贴时被调用完全不同,这就是我解释 OP 问题的方式。
  • 我的立场是正确的。但是,如果小部件的文本恰好与剪贴板匹配,pasteEvent 仍然会被调用。但是,这并不一定意味着文本到达那里是因为它被粘贴了。虽然这可能对您的用例无关紧要。
【解决方案2】:

您必须自己通过覆盖“keyPressEvent”来定义它。例如:

from PyQt4 import QtGui, QtCore
import sys

class NoteText(QtGui.QLineEdit):
    def __init__(self, parent):
        super (NoteText, self).__init__(parent)

    def keyPressEvent(self, event):
        if event.matches(QtGui.QKeySequence.Paste):
            self.setText("Bye")

class Test(QtGui.QWidget):
  def __init__( self, parent=None):
      super(Test, self).__init__(parent)

      le = QtGui.QLineEdit()
      nt = NoteText(le)

      layout = QtGui.QHBoxLayout()
      layout.addWidget(nt)
      self.setLayout(layout)

app = QtGui.QApplication(sys.argv)
myWidget = Test()
myWidget.show()
app.exec_()

【讨论】:

  • 我正在从另一个文件导入用户界面,如class MyForm(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.threads = [] self.ui.pushButton_Start.clicked.connect(self.thread_start),请您帮忙。为此发布一个对新手友好的示例?
  • 类似self.ui.lineEdit_URL.textChanged.connect(self.KeyDown) def KeyDown(self, event): # implement the method here if event.matches(QtGui.QKeySequence.Paste): print 'Pasted' 但这会导致AttributeError: 'QString' object has no attribute 'matches'
  • @Stacked。请不要使用代码转储向 cmets 发送垃圾邮件。如果您有与您的问题相关的代码,请将其添加到问题本身。
  • @ekhumoro:嗯,严格来说,这些是简短的 sn-ps,在 cmets 恕我直言中是可以的。 OP 不能总是判断这些东西的用处,而 cmets 总是可以清理的。当我收到简短的 sn-ps 或类似这样的错误消息来推动问题向前发展时,我发现它自己很有用。
  • @LaszloPapp。它们在这个问题中会更有用,目前只有一个句子长。更重要的是,他们没有直接解决这个问题,因此在这种情况下没有建设性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多