QTableWidget和QHeaderView随鼠标移动设置选中效果

场景:

有一张表格,希望能追踪鼠标移动,并高亮显示对应的单元格和行列

具体实现:

//QTableWidget子类开始
//鼠标追踪
setMouseTracking(true);  
//具体处理在mouseMoveEvent中
void mouseMoveEvent(QMouseEvent* e)
{
    if (auto item = itemAt(e->pos()))
    {
        if (item && m_hover_item != item)
        {
            m_hover_item = item;	//m_hover_item 是记录的当前鼠标所在项
            update();	//必须,否则不会更新
        }
    }
}

//QTableWidget子类结束

//QHeaderView子类开始
void MyHeader::paintSection(QPainter* painter, const QRect& rect, int logicalIndex) const
{
	
    painter->save();	//非常重要
    QHeaderView::paintSection(painter, rect, logicalIndex);
    painter->restore();	//非常重要,父类方法会导致painter在后续失效

	//save,restore必须,否则下面的内容没有效果
    if (m_table && m_table->hoverItem())
    {
        if (orientation() == Qt::Horizontal && logicalIndex == m_table->hoverItem()->column())
        {
            QPen pen(Qt::white, 2); // Set the pen color and width
            painter->setPen(pen);
            painter->setBrush(Qt::NoBrush);
            painter->drawRect(rect.adjusted(1, 1, -1, -1)); // Draw a border around the section
        }
        else if (orientation() == Qt::Vertical && logicalIndex == m_table->hoverItem()->row())
        {
            QPen pen(Qt::white, 2); // Set the pen color and width
            painter->setPen(pen);
            painter->setBrush(Qt::NoBrush);`在这里插入代码片`
            painter->drawRect(rect.adjusted(1, 1, -1, -1)); // Draw a border around the section
        }
    }
}
//QHeaderView子类结束


//TableDelegate子类开始
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
    {
        QItemDelegate::paint(painter, option, index);

        if (m_table && m_table->hoverItem())
        {
            auto item = m_table->hoverItem();
            if (index.row() == item->row() && index.column() == item->column())
            {
                painter->setPen(QPen(Qt::white, 2));
                painter->setBrush(Qt::NoBrush);
                painter->drawRect(option.rect.adjusted(1, 1, -1, -1));
            }
        }
    }
//TableDelegate子类结束

分析:

设置单元格选中效果,需要先调用父类QItemDelegate::paint(painter, option, index);然后再做选中效果
设置行列选中效果,需要先调用QHeaderView::paintSection(painter, rect, logicalIndex);并且在调用时先对painter.save(),调用完父类方法后再restore(),然后才是选中效果


实现效果:

在这里插入图片描述
截图时,鼠标位于(1, 0)处(从0开始),所以第二行第一列高亮,并且单元格高亮

Qt是一个跨平台的C++应用程序框架,广泛用于开发图形界面应用程序。QTableWidgetQt中用于创建表格的控件,它可以显示操作表格数据。 要实现QTableWidget的tooltip跟随鼠标移动,可以通过重写QTableWidget的几个事件处理函数来完成。具体步骤如下: 1. 重写`enterEvent``leaveEvent`函数:这两个事件分别在鼠标进入离开控件时被触发。可以在这里设置清除tooltip文本。 2. 重写`mouseMoveEvent`函数:这个事件在鼠标在控件上移动时被触发。根据鼠标的位置可以获取到当前所在的单元格,并显示相应的tooltip。 3. 设置tooltip文本:在`mouseMoveEvent`中获取到的单元格数据可以用来设置tooltip的文本。 以下是实现这个功能的代码示例: ```cpp void MyTableWidget::enterEvent(QEvent *event) { QTableWidget::enterEvent(event); showToolTip(); } void MyTableWidget::leaveEvent(QEvent *event) { QTableWidget::leaveEvent(event); clearToolTip(); } void MyTableWidget::mouseMoveEvent(QMouseEvent *event) { QTableWidget::mouseMoveEvent(event); showToolTip(); } void MyTableWidget::showToolTip() { QPoint pos = QCursor::pos(); QModelIndex index = indexAt(pos); if (index.isValid()) { setToolTip(itemFromIndex(index)->text()); // 假设tooltip显示当前单元格的文本 } } void MyTableWidget::clearToolTip() { setToolTip(""); } ``` 在这个示例中,`MyTableWidget`是继承自`QTableWidget`的自定义控件。`showToolTip``clearToolTip`函数分别用于设置清除tooltip文本。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值