我有一个表,我想通过单击鼠标来更新项目。到目前为止,该更新几乎完美无缺。我遇到了一个奇怪的问题,当我单击表格小部件底部的水平滚动条时,它将单击的内容记录为单击鼠标正上方列中的第一项。
我正在运行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进行过滤将防止意外的滚动条更新,但这也不起作用。
有人知道这是怎么回事吗?
答案 0 :(得分:0)
滚动条位于QTableWidget的itemAt(event.pos())
内部,因此,当您获得mousePressEvent
时,即使单击滚动条,它仍然可以使用。您可以获得滚动条的几何形状,并且仅在事件位置不在该区域内时执行操作。
def eventFilter(self, source, event): if event.type() == QtCore.QEvent.MouseButtonPress: if not self.horizontalScrollBar().geometry().contains(event.pos()): item = self.itemAt(event.pos()) if 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)
或者您也可以重新实现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())
,默认情况下它将忽略对滚动条的单击。
private SmppClient CreateSmppClient(ISmppConfiguration config)
{
var client = new SmppClient
{
Name = config.Name
};
//client.SmppEncodingService = new SmppEncodingService(System.Text.Encoding.UTF8);
client.ConnectionStateChanged += Client_ConnectionStateChanged;
client.StateChanged += Client_StateChanged;
client.MessageSent += Client_MessageSent;
client.MessageDelivered += Client_MessageDelivered;
client.MessageReceived += Client_MessageReceived;
var properties = client.Properties;
properties.SystemID = config.SystemId;// "mysystemid";
properties.Password = config.Password;// "mypassword";
properties.Port = config.Port;// 2034; //IP port to use
properties.Host = config.Host;// "196.23.3.12"; //SMSC host name or IP Address
properties.SystemType = config.SystemType;// "mysystemtype";
properties.DefaultServiceType = config.DefaultServiceType;// "mydefaultservicetype";
properties.DefaultEncoding = config.Encoding;
//Resume a lost connection after 30 seconds
client.AutoReconnectDelay = config.AutoReconnectDelay;
//Send Enquirer Link PDU every 15 seconds
client.KeepAliveInterval = config.KeepAliveInterval;
return client;
}