QTableView计时器click和doubleclick事件

时间:2020-11-04 08:17:56

标签: python pyside2

我要在单击并双击时执行其他命令。当执行双击时,不想执行单击。

from PySide2 import QtWidgets, QtCore, QtGui


class TestView(QtWidgets.QTableView):
    
    custom_clicked = QtCore.Signal(QtCore.QModelIndex)
    custom_double_clicked = QtCore.Signal(QtCore.QModelIndex)

    def __init__(self, parent=None):
        super(TestView, self).__init__(parent=parent)
        self.timer = QtCore.QTimer(self)
        self.timer.setInterval(250)
        self.timer.setSingleShot(True)
        self.timer.timeout.connect(self.timeout)
        self.click_number = 0

    def mousePressEvent(self, event):
        super(TestView, self).mousePressEvent(event)
        if event.button() == QtCore.Qt.LeftButton:
            self.index = self.indexAt(event.pos())
            self.click_number += 1
            if not self.timer.isActive():
                self.timer.start()

    def timeout(self):
        if self.click_number < 2:
            self.custom_clicked.emit(self.index)
        elif self.click_number > 1:
            self.custom_double_clicked.emit(self.index)
        self.click_number = 0


def click_command(index):
    print "single", index

def double_click_command(index):
    print "double", index

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    tableView = TestView()
    model = QtGui.QStandardItemModel()
    item = QtGui.QStandardItem()
    item.setData("test", QtCore.Qt.DisplayRole)
    model.setItem(0, item)
    tableView.setModel(model)
    tableView.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
    tableView.custom_clicked[QtCore.QModelIndex].connect(click_command)
    tableView.custom_double_clicked[QtCore.QModelIndex].connect(double_click_command)
    tableView.show()
    sys.exit(app.exec_())

没有任何项目时,此代码可以很好地工作。 但是,如果双击该项目,它将中断。 计时器似乎是原因,但我在寻找原因。

1 个答案:

答案 0 :(得分:2)

要检测双击,您只应使用mouseDoubleClickEvent,这样您只需检测在特定时间内没有第二次按下鼠标即可。

class TestView(QtWidgets.QTableView):

    custom_clicked = QtCore.Signal(QtCore.QModelIndex)
    custom_double_clicked = QtCore.Signal(QtCore.QModelIndex)

    def __init__(self, parent=None):
        super(TestView, self).__init__(parent)
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.timeout)
        self.timer.setInterval(
            QtGui.QGuiApplication.styleHints().mouseDoubleClickInterval()
        )
        self.timer.setSingleShot(True)

    def mousePressEvent(self, event):
        super(TestView, self).mousePressEvent(event)
        if event.button() == QtCore.Qt.LeftButton:
            self.index = self.indexAt(event.pos())
            self.timer.start()

    def mouseDoubleClickEvent(self, event):
        super(TestView, self).mouseDoubleClickEvent(event)
        if event.button() == QtCore.Qt.LeftButton:
            index = self.indexAt(event.pos())
            self.custom_double_clicked.emit(index)
            self.timer.stop()

    def timeout(self):
        self.custom_clicked.emit(self.index)
相关问题