pyQt5中单击、双击、拖动事件区分

一般在处理单击、双击、拖动事件时会遇到以下问题:

  • 双击时会产生两个额外的单击事件和两个释放事件
  • 拖动时会在拖动开始处产生一个单击事件,在拖动结束时产生一个释放事件

故采用signal作为事件类型的标志加以区分。此处采用释放时生效单击事件。

用定时器等待双击事件,在时间内如果没有判断得到双击事件即为单击事件

# 实例化功能按钮
class button1(QPushButton):
    def __init__(self, parent=None):
        super(button1, self).__init__(parent)
        self.setText("记事本")
        self.resize(100, 100)

        self.signal1 = 0        # 判断鼠标事件类型的标志
        self.mousepos1 = 0      # 用于拖动时的鼠标位置初始值
        self.timer = QTimer()
        self.timer.timeout.connect(self.timerout1)      # 定时器,初始化连接到timerout1函数

# 定义鼠标事件
    def mouseDoubleClickEvent(self, QMouseEvent):
        self.signal = 2
        self.close()

    def mouseMoveEvent(self, QMouseEvent):
# 定义窗口随鼠标移动方法1
        if QMouseEvent.buttons() == Qt.LeftButton:
            self.mousepos2 = QMouseEvent.screenPos()
            self.toposx = int(self.frameGeometry().x() + self.mousepos2.x() - self.mousepos1.x())
            self.toposy = int(self.frameGeometry().y() + self.mousepos2.y() - self.mousepos1.y())
            self.move(self.toposx, self.toposy)
            self.mousepos1 = self.mousepos2
            self.signal1 = 3

    def mousePressEvent(self, QMouseEvent):
        if QMouseEvent.buttons() == Qt.LeftButton:
            self.mousepos1 = QMouseEvent.screenPos()
# 采用按钮释放时相应点击事件
    def mouseReleaseEvent(self, e: QtGui.QMouseEvent) -> None:
        if self.signal1 == 0:
            self.timer.start(1000)
            self.signal1 = 1
        elif self.signal1 == 3:       # 拖动事件标志
            self.signal1 = 0
# 定时器功能函数
    def timerout1(self):
        if self.signal1 == 1:
            self.remember()        # 单击事件处理函数
        self.signal1 = 0
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt5,QCompleter是用于自动补全和建议的小部件,可以将其与QLineEdit、QPlainTextEdit和QTextEdit等小部件一起使用。 默认情况下,QCompleter使用单击选择列表的项目。如果您想要将其更改为双击选择,请按照以下步骤进行操作: 1. 创建一个自定义的QCompleter子类并覆盖其eventFilter方法。 2. 在eventFilter方法,检查是否为双击事件,并且如果是,则发出QCompleter的activated信号。 下面是一个示例代码: ```python from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QCompleter class DoubleClickCompleter(QCompleter): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setCompletionMode(QCompleter.PopupCompletion) def eventFilter(self, obj, event): if event.type() == QEvent.MouseButtonDblClick: self.activated.emit(self.currentIndex()) return super().eventFilter(obj, event) ``` 在这里,我们创建了一个名为DoubleClickCompleter的子类,并覆盖了其eventFilter方法。我们设置了QCompleter的完成模式为PopupCompletion(弹出式完成),这意味着当用户输入时,QCompleter会显示一个弹出窗口来提供建议。 在eventFilter方法,我们检查是否为双击事件,并且如果是,则发出QCompleter的activated信号。最后,我们调用父类的eventFilter方法以确保所有其他事件都被正确处理。 现在,我们可以将该子类用作QLineEdit、QPlainTextEdit或QTextEdit的自动完成器,并且它将使用双击选择列表的项目。例如: ```python from PyQt5.QtWidgets import QApplication, QLineEdit, QWidget, QVBoxLayout app = QApplication([]) window = QWidget() layout = QVBoxLayout(window) edit = QLineEdit() completer = DoubleClickCompleter(['apple', 'banana', 'cherry'], edit) edit.setCompleter(completer) layout.addWidget(edit) window.show() app.exec_() ``` 在这里,我们创建了一个QLineEdit小部件,并将其自动完成器设置为DoubleClickCompleter。我们将一些字符串传递给自动完成器,以便它可以为用户提供建议。最后,我们将QLineEdit添加到窗口布局并显示窗口。 现在,当用户双击建议列表的项目时,它将被选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值