PyQt5-QTableWidget水平滚动条

时间:2020-03-24 13:27:22

标签: python-3.x pyqt5

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

我正在运行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进行过滤将防止意外的滚动条更新,但这也不起作用。

有人知道这是怎么回事吗?

1 个答案:

答案 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;
    }