如何在从另一个小部件拖放事件期间突出显示表格单元格

Posted

技术标签:

【中文标题】如何在从另一个小部件拖放事件期间突出显示表格单元格【英文标题】:How to highlight table cell during drag&drop event from another widget 【发布时间】:2018-11-24 20:41:44 【问题描述】:

有两个可停靠的小部件:一个带有图标(QLabel),另一个带有表格(QTableWidget)。

我一直在尝试在第二个小部件的拖放事件期间在鼠标悬停时实现表格的单元格颜色。问题是他们不这样做。表格的类很简单,添加了用于悬停的事件过滤器。

class TableEdit(QtWidgets.QTableWidget):
    def __init__(self, parent=None):
        super(TableEdit, self).__init__(parent=parent)

        # self.setMinimumSize(QtCore.QSize(self.width(), self.height()))

        self.current_hover = [0, 0]
        row = 3
        column = 3

        self.setColumnCount(column)
        self.setAlternatingRowColors(True)

        self.setRowCount(row)

        for row in range(0, 3):
            for column in range(0, 3):
                item = QtWidgets.QTableWidgetItem("This is cell  ".format(row + 1, column + 1))
                self.setItem(row, column, item)

        self.setHorizontalHeaderItem(0, QtWidgets.QTableWidgetItem("Col1"))
        self.horizontalHeader().setVisible(False)
        # self.setShowGrid(False)

        self.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)

        self.setAcceptDrops(True)
        self.setMouseTracking(True)
        self.cellEntered.connect(self.cellHover)

    def cellHover(self, row, column):
        item = self.item(row, column)
        old_item = self.item(self.current_hover[0], self.current_hover[1])
        if self.current_hover != [row, column]:
            old_item.setBackground(QtGui.QBrush(QtGui.QColor('white')))
            item.setBackground(QtGui.QBrush(QtGui.QColor('yellow')))
        self.current_hover = [row, column]

    def dragEnterEvent(self, event):
        event.accept()
        print("drag enter +")

    def dragMoveEvent(self, event):
        event.accept()

    def dropEvent(self, event):
        event.accept()
        print("drop +")

        mime = event.mimeData()
        if mime.hasFormat("application/x-fire"):
            print("Fire")

这是一个屏幕截图,显示将 QLabel 拖入单元格时没有任何反应。

【问题讨论】:

应该只在拖动项目时更改颜色?当没有拖动任何东西并且鼠标在项目顶部时会发生什么? 【参考方案1】:

你必须实现dragMoveEvent方法并实现颜色的逻辑,获取项目你必须使用QCursor的位置:

class TableEdit(QtWidgets.QTableWidget):
    def __init__(self, parent=None):
        super(TableEdit, self).__init__(parent)
        self.hover_item = None

        row, column = 3, 3
        self.setColumnCount(column)
        self.setAlternatingRowColors(True)
        self.setRowCount(row)

        for r in range(self.rowCount()):
            for c in range(self.columnCount()):
                item = QtWidgets.QTableWidgetItem("This is cell  ".format(r + 1, c + 1))
                self.setItem(r, c, item)

        self.setHorizontalHeaderItem(0, QtWidgets.QTableWidgetItem("Col1"))
        self.horizontalHeader().setVisible(False)
        # self.setShowGrid(False)
        self.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)

        self.setAcceptDrops(True)
        self.setMouseTracking(True)

    def dragMoveEvent(self, event):
        p = self.viewport().mapFromGlobal(QtGui.QCursor().pos())
        it = self.itemAt(p)
        if self.hover_item != it:
            if self.hover_item is not None:
                self.hover_item.setBackground(QtCore.Qt.white)
            self.hover_item = it
            if self.hover_item is not None:
                self.hover_item.setBackground(QtCore.Qt.yellow)
        super(TableEdit, self).dragMoveEvent(event)

    # ...

【讨论】:

以上是关于如何在从另一个小部件拖放事件期间突出显示表格单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何在从另一个小部件继承的小部件中设置数据?

从 PyQt 中的表格小部件中选择多行后,单元格小部件(按钮)显示在错误的位置

如何避免在表格视图中突出显示两个单元格?

目标 C:如何突出显示 tableView 单元格并在重新加载表格时保持突出显示?

单击时突出显示表格视图单元格

目标 C:如何在视图加载时突出显示表格视图中的第一个单元格?