NSTableView中设置selectedRow的高亮颜色

本文介绍了如何在表格视图中自定义单元格背景颜色和高亮效果,包括通过继承NSCell和NSTableView的方法实现,并解决选中状态下的背景颜色与系统默认蓝色冲突的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有两种方法:第一种是继承NSCell:

                        第二种是继承NSTableView。

在tableView中,使用

[myView setUsesAlternatingRowBackgroundColors:NO];//取消行与行之间蓝白交替显示的背景

继承NSCell:

@interface subNSTableCell : NSCell
{
	NSColor*				_cellBKColor;
	NSColor*				_cellFontColor;
	NSAttributedString*                     _cellAttributedString;
}

- (void)setSelectionBKColor:(NSColor*)cellColor;
- (void)setSelectionFontColor:(NSColor*)cellFontColor;
- (NSAttributedString*)getCellAttributes;

@end

设置color和属性:

- (NSAttributedString*)getCellAttributes
{
	NSDictionary*  _attributes = [NSDictionary dictionaryWithObjectsAndKeys:_cellFontColor,NSForegroundColorAttributeName,nil];
	NSString* _cellString = [self stringValue];
	
	_cellAttributedString = [[[NSAttributedString alloc]
							  initWithString:_cellString attributes:_attributes] autorelease];
	
	return _cellAttributedString;
}

然后重写方法highlightColorWithFrame:inView:

- (NSColor*)highlightColorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
	NSRect newRect = NSMakeRect(cellFrame.origin.x - 1, cellFrame.origin.y, cellFrame.size.width + 5, cellFrame.size.height);
	if (_cellBKColor)
	{
		[_cellBKColor set];
		NSRectFill(newRect);
	}
	
	[self setAttributedStringValue:[self getCellAttributes]];
	
	return nil;
}

最后,在tableView中使用子类化的cell。

subNSTableCommonCell*	tTableCell = nil;
	
	tTableCell = [[subNSTableCommonCell alloc] initTextCell:@""];
	
	[tTableCell setSelectionBKColor:[NSColor lightGrayColor]];
	[tTableCell setSelectionFontColor:[NSColor redColor]];
	
	[[[mytableView tableColumns] objectAtIndex:0] setDataCell:tTableCell];

这样继承的cell,在处于选中状态时,能够按照我的设置背景显示成lightGrayColor,cell中的字体为redColor。

但是当选中的一行含有多列时,cell与cell之间的空隙会被系统的那个高亮颜色——蓝色给占据。即使只有一行时,在cell的边框能很明显的看见蓝色。

然后在网上查找到的资源,继承NSTableView,直接改变处于选中状态的系统设置的蓝色。

继承NSTableView:

将以下方法加入到子类化的tableView中可以将tableView中处于选中状态的行按照_highlightBKColor的颜色来显示。_highlightBKColor可以自行设置。

- (id)_highlightColorForCell:(id)cell 
{
	
	if([self selectionHighlightStyle] == 1) 
	{
		return nil;
	} 
	else 
	{
		return _highlightBKColor;
	}
}
另外,设置选中状态字体颜色等可以放在以下方法中执行。

- (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(int)rowIndex



                     


在 Qt 的 QListWidget 中,如果你想更改列表项 (QListWidgetItem) 高亮显示的颜色(例如选中某一项时的背景色),你可以通过自定义样式表 (QSS - Qt Style Sheets) 或者直接修改 QBrush 来实现。 以下是两种常见的方法: ### 方法一:使用样式表 (Qt Style Sheet) ```cpp ui->listWidget->setStyleSheet("QListView::item:selected { background-color: yellow; }"); ``` 上述代码将 `QListWidget` 当前选定项目 (`selected`) 的背景色设置成了黄色。你可以替换 "yellow" 为你需要的颜色值(比如 RGB 格式、HEX 等)。 #### 示例: 如果想让文字变成红色并且背景为浅蓝色,则可以这样写: ```css QListView::item:selected { color: red; background-color: lightblue; } ``` --- ### 方法二:利用模型索引来改变特定项目的外观 如果你只希望对某些特殊的条目应用独特的高亮效果而不仅仅是整个控件的话,可以采用以下步骤完成该任务: 1. **重绘 item** 创建一个新的 delegate 并重新绘制所需的元素。 2. **示例代码** ```cpp class HighlightDelegate : public QItemDelegate { public: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override { if(option.state & QStyle::State_Selected){ painter->fillRect(option.rect, QColor(255,0,0)); // 设置为红色背景 } QString text = index.data().toString(); painter->drawText(option.rect, Qt::AlignCenter, text); } }; // 应用到 ListWidget 上 HighlightDelegate* delegate = new HighlightDelegate(ui->listWidget); ui->listWidget->setItemDelegate(delegate); ``` --- 这两种方法各有优劣,第一种更为简单快捷适合统一全局风格;第二种则允许更精细地控制每个单独单元格的表现形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值