【问题标题】:PyQt5 - QTableWidget horizontal scroll barPyQt5 - QTableWidget 水平滚动条
【发布时间】:2020-03-25 16:25:52
【问题描述】:

我有一个表格,我想通过单击鼠标按钮来更新项目。到目前为止,更新几乎完美无缺。我遇到了一个奇怪的问题,当我单击表格小部件底部的水平滚动条时,它会将单击注册为单击鼠标正上方列中的第一项。

我正在运行 python 3.7,pyqt5。

这是表格:

class PlotTable(QTableWidget):

    removed_column = QtCore.pyqtSignal(int)
    update_table = QtCore.pyqtSignal(object)

    def __init__(self, rows=0, columns=0, parent=None):
        QTableWidget.__init__(self, rows, columns, parent)
        self.viewport().installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            item = self.itemAt(event.pos())
            if item is not None and isinstance(item, QTableWidgetItem):
                if event.buttons() == QtCore.Qt.MidButton:
                    col = item.column()
                    self.removeColumn(col)
                    self.removed_column.emit(col)
                elif event.buttons() == QtCore.Qt.LeftButton:
                    self.update_table.emit(item)

        return super().eventFilter(source, event)

目标是更新表选择或从表中删除列,具体取决于点击类型。我想也许过滤 QTableWidgetItem 可以防止意外滚动条更新,但这也不起作用。

有人知道这里发生了什么吗?

【问题讨论】:

    标签: python-3.x pyqt5


    【解决方案1】:

    滚动条在QTableWidget的contentsRect里面,所以当你得到itemAt(event.pos())时,即使你点击滚动条它仍然有效。您可以获得滚动条的几何形状,并且仅当事件位置不在该区域内时才执行操作。

    def eventFilter(self, source, event): 如果 event.type() == QtCore.QEvent.MouseButtonPress: 如果不是 self.horizo​​ntalScrollBar().geometry().contains(event.pos()): 项目 = self.itemAt(event.pos()) 如果是实例(项目,QTableWidgetItem): 如果 event.buttons() == QtCore.Qt.MidButton: col = item.column() self.removeColumn(col) self.removed_column.emit(col) elif event.buttons() == QtCore.Qt.LeftButton: self.update_table.emit(项目) return super().eventFilter(source, event)

    或者您可以重新实现mousePressEvent,默认情况下将忽略对滚动条的点击。

    def mousePressEvent(self, event):
        super().mousePressEvent(event)
        if event.buttons() & QtCore.Qt.MidButton:
            col = self.currentColumn()
            self.removeColumn(col)
            self.removed_column.emit(col)
        elif event.buttons() & QtCore.Qt.LeftButton:
            self.update_table.emit(self.currentItem())
    
    

    【讨论】:

    • if item is not None and isinstance(item, QTableWidgetItem): 更改为if isinstance(item, QTableWidgetItem):。您的代码是多余的。
    • 好的,我只是从问题中复制过来的
    猜你喜欢
    • 1970-01-01
    • 2012-09-16
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2011-06-27
    相关资源
    最近更新 更多