GTK+中如何按处理进度实现GtkListBoxRows控件的局部高亮
GtkListBoxRow 进度高亮实现方案
你不需要单独调用底层的Cairo/Pango函数就能实现该需求,GTK本身提供了更便捷的上层接口,若需要高度自定义的绘制效果,也可以结合Cairo的能力实现:
- 推荐方案:通过CSS样式类实现状态高亮
该方案不需要自定义绘制,适配性最高:- 先在GTK应用的样式表中定义对应处理状态的样式类,示例如下:
/* 待处理状态 */ .row-pending { background-color: transparent; } /* 处理中状态 */ .row-processing { background-color: #3584e4; color: #ffffff; } /* 处理完成状态 */ .row-completed { background-color: #2ec27e; color: #ffffff; } /* 处理失败状态 */ .row-failed { background-color: #e01b24; color: #ffffff; }- 每个文件的处理状态更新时,先调用
gtk_widget_remove_css_class()移除GtkListBoxRow上旧的状态样式类,再调用gtk_widget_add_css_class()添加对应状态的新样式类即可,行内的按钮、文本等子部件会自动继承样式,也可以单独写CSS规则调整子部件的样式表现。
- 自定义绘制方案:结合Cairo实现进度条式逐行填充
如果你需要实现类似进度条的渐进式填充效果(比如行背景随着处理进度从左到右逐步填充),可以绑定GtkWidget的draw信号实现:- 为每个
GtkListBoxRow实例单独存储当前处理进度值(取值为0-1的浮点数,1代表处理完成) - 绑定行部件的
draw信号,在回调函数中首先获取Cairo上下文cr,计算填充宽度 = 行部件实际宽度 * 进度值,调用cairo_rectangle()绘制对应宽度的填充矩形,设置颜色后调用cairo_fill()完成背景填充,最后调用gtk_widget_draw_child()绘制行内的按钮、文本等子部件即可。 - 每次进度更新时调用
gtk_widget_queue_draw()触发对应行的重绘,就能实现实时的进度填充效果。
- 为每个
补充说明:如果要单独修改行内文本的颜色,除了用CSS外也可以手动调用pango_layout_set_foreground()调整Pango布局的前景色,绝大多数场景下CSS方案足够覆盖需求,不需要手动操作Pango接口。
内容的提问来源于stack exchange,提问作者ADBeveridge
相关产品推荐
相关产品推荐

