QTableview实现鼠标放上面显示不同颜色

suoniao 2021-04-06
需要:0索币

需要实现QTableview鼠标悬浮时当前行高亮显示。但是实现的过程中发现一开始的方案不能用,必须捕捉鼠标的move事件通过Delegate自己绘制背景实现。一开始想通过重载Delegate里面的editorEvent捕捉。后面发现鼠标的move事件可以捕捉的到,但是leave事件获取不到,这样就会造成鼠标移出表格始终又一行高亮。后面只能通过继承QTableview捕捉到鼠标事件,然后通过delegate绘制的方法实现。

初始方案

在Qt4中可以直接设置item的悬停(hover)事件,如下所示:


QTableView::item:hover {

    background-color: rgba(200,200,220,255);

}        

然后在tableview的属性中设置selectionMode和selectionBehavior的属性为每次选中一行。


ui.TableView->setSelectionBehavior(QAbstractItemView::SelectRows);

ui.TableView->setSelectionMode(QAbstractItemView::SingleSelection);

结果发现在Qt5中样式表设置的样式不能生效。所以只能另找方案。


解决方案确定

在stackoverflow上面查了有人提供了下面的方案:


You can use delegates to draw the row background…

You will need to set the row to highlight in the delegate and based on that, do the highlighting.

Catch the signal of current row. Iterate over the items in that row and set background for each item.

翻译一下就是捕捉当前鼠标悬浮(hover)行的信号,使用委托绘制行背景。


绘制背景

绘制背景的话只能通过重载QStyledItemDelegate里面的paint函数进行选中行的背景绘制。

捕捉当前鼠标悬浮的信号

在获取鼠标hover的信号的过程中遇到了一些问题。一开始希望通过QStyledItemDelegate里面的editorEvent,捕获里面event的动作获取悬浮信号。

bool CRoomMemDelegate::editorEvent(QEvent * event, QAbstractItemModel * model, const QStyleOptionViewItem & option, const QModelIndex & index)

{

if (event->type() == QEvent::MouseMove)//鼠标移动事件

{

    m_selectionRow = index.row();

}

else if(event->type() == QEvent::leave)//离开事件

{

     m_selectionRow = -1;

}

return false;

}

如上尝试了通过m_selectionRow 保存当前悬停的行,然后在paint函数里面进行绘制背景。不过调试中发现mousemove动作可以捕获的到,但是leave事件得不到。所以会导致无论如何都会有一行被选中。


为了能够捕捉到鼠标的事件,子类话了QTableview,然后通过信号告诉QStyledItemDelegate鼠标的move/leave的动作。这个信号把悬停的当前行的信息发送出去。QStyledItemDelegate获取到hoving的行,保存当前行的信息并触发paint的动作进行绘制。具体的操作代码如下:


//1: Tableview :

void TableView::mouseMoveEvent(QMouseEvent *event)

{

    QModelIndex index = indexAt(event->pos());

    emit hoverIndexChanged(index);

    ...

}

//2.connect signal and slot

    connect(this,SIGNAL(hoverIndexChanged(const QModelIndex&)),delegate_,SLOT(onHoverIndexChanged(const QModelIndex&)));


//3.onHoverIndexChanged

void TableViewDelegate::onHoverIndexChanged(const QModelIndex& index)

{

    hoverrow_ = index.row();

}


//4.in Delegate paint():

void TableViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const

{

...

    if(index.row() == hoverrow_)

    {

        //HERE IS HOVER COLOR

        painter->fillRect(option.rect, kHoverItemBackgroundcColor);

    }

    else

    {

        painter->fillRect(option.rect, kItemBackgroundColor);

    }

...

}

上面的代码少了一个步骤就是触发paint绘制的动作,这个可以调用model里面的dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles = …)函数刷新对应行的信息。

原文链接:https://blog.csdn.net/u013394556/article/details/103313782

回帖
  • 消灭零回复
相关主题
Qt利用QLabel组件来显示图片 0
TableView自定义代理QStyledItemDelegate实现ComboBox 0
Qt利用QGraphicsView类实现图片放大缩小平移显示 0
Qt实现非阻塞延迟方法sleep 0
Qt实现webdav客户端功能支持https协议的webdav客户端 0
Qt操作windows注册表的方法 bat从注册表中将键值删除 0
重写QSqlQueryModel实现QTableView显示图片 0
QLocalServer基于本地套接字socket的服务端server 0
Qt使用动态库的方法 QLibrary库的典型用法 0
QT实现视频播放器界面开发 0
QTableview实现鼠标放上面显示不同颜色 0
Qt的QTableView自定义委托详解 0
QTableView利用自定义委托实现日期显示下拉菜单文字颜色等 0
Qt利用QApplication::sendEvent和QMouseEvent模拟鼠标点击事件 0
Qt获取父进程路径和父进程ID代码 0
QStyledItemDelegate和QItemDelegate区别在于绘制和向视图提供编辑器的方式 0
Qt实现全局快捷键功能利用QxtGlobalShortcut库 0
利用QSS去掉QListWidget选中时的虚线框 0
如何自己使用 QEventLoop解决窗口一闪而过的问题 0
Qt 为什么没有提供跨平台的 sleep 函数? 0
相关主题
打印机USB驱动开发之实现打印服务器 0
Qt利用QLabel组件来显示图片 0
TableView自定义代理QStyledItemDelegate实现ComboBox 0
Qt利用QGraphicsView类实现图片放大缩小平移显示 0
Qt实现非阻塞延迟方法sleep 0
海康相机SDK的C++对应的接口 0
Qt实现webdav客户端功能支持https协议的webdav客户端 0
CHKDSK解决 移动硬盘只能看见盘符其它信息都看不见另外双击也打不开 0
gogs一直报errror:dial tcp xxx.xxx.xxx.xxx 宿主机的ip 0
索鸟快传2.1.2发布 0
索鸟快传2.1.1发布 0
Qt操作windows注册表的方法 bat从注册表中将键值删除 0
重写QSqlQueryModel实现QTableView显示图片 0
QLocalServer基于本地套接字socket的服务端server 0
Qt使用动态库的方法 QLibrary库的典型用法 0
QT实现视频播放器界面开发 0
QTableview实现鼠标放上面显示不同颜色 0
Qt的QTableView自定义委托详解 0
QTableView利用自定义委托实现日期显示下拉菜单文字颜色等 0
Qt利用QApplication::sendEvent和QMouseEvent模拟鼠标点击事件 0