【发布时间】:2018-02-06 13:13:35
【问题描述】:
我正在使用 Python 3.5 和 PyQt5 编写软件。当我覆盖 QTableWidget 的 mousePressEvent 时,cellClicked 信号不再触发。我需要覆盖 mousePressEvent 以获取鼠标单击的位置,而 cellClicked 需要为单击的单元格执行另一项工作。为什么会这样?问题出在哪里? 这是我覆盖事件的代码:
class QTableWidget(QTableWidget):
def checking(self):
if (self.endgingposx - self.startingposx) >= 50:
self.clear()
def mousePressEvent(self,event):
event.accept()
self.startingposx = event.x()
def mouseReleaseEvent(self,event):
event.accept()
self.endgingposx = event.x()
self.checking()
这是我的点击信号,它是已连接的插槽:
self.main_table.cellClicked.connect(self.populatescnte)
def populatescnte(self,row,column):
itemnum = self.scentence_listw.count()
exec("item{} = QListWidgetItem(QIcon('content/img/food.png'),'{}')".format(itemnum+1,self.main_table.cellWidget(row,column).text))
exec("self.scentence_listw.addItem(item{})".format(itemnum+1))
self.scentence_listw 是一个 QListWidget。 提前谢谢你。
更新 谢谢大家,这段代码对我有用:
class myTableWidget(QTableWidget):
def checking(self):
if (self.endgingposx - self.startingposx) >= 50:
self.clear()
def mousePressEvent(self,event):
super().mousePressEvent(event)
self.startingposx = event.x()
def mouseReleaseEvent(self,event):
super().mouseReleaseEvent(event)
self.endgingposx = event.x()
self.checking()
【问题讨论】:
-
(不太了解 Python 或 QT 警告)- 当您覆盖 GUI 的事件处理程序时,这通常意味着不再调用原始事件处理程序。点击可能是由该原始处理程序生成的。要恢复它,您的替换处理程序应该直接调用原始处理程序 - 可能调用相同的事件处理程序名称,但用于基类。顺便说一句 - 我读的是顶行吗?基类和派生类的名称是否相同?这可能会使调用基类方法(例如原始处理程序)变得困难,尽管我不记得足够多的 Python 来确定。
-
@Steve314 如果我更改派生类的名称,则不会发生更改的事件。如何直接调用原始处理程序?
-
您需要为
mousePressEvent调用 super 才能启动原始处理程序。 -
@DanielePantaleone 我写了这个:
super().mousePressEvent()但它给出了错误发送不是我提出的 QMouseEvent 的 enoghu 争论,但它给出了它的论点错误。正确的方法是什么? -
您需要将QMouseEvent实例传递给原始处理程序:super().mousePressEvent(event)
标签: python pyqt pyqt5 qtablewidget