我有一个NSTableView
,在没有用户干预的情况下添加了项目。当用户返回包含NSTableView
的对话框并单击某个项目时,该项目将突出显示。但是,如果右键单击某个项目,则该项目不会突出显示。有没有办法突出显示右键单击的项目?
我目前有以下内容:
void Dialog::menuAction(ui::Menu::Item* item)
{
// Highlight the item clicked
[tableView row:item select:YES]
...
}
但这似乎不起作用。
答案 0 :(得分:1)
这可能不是您想要的,但它可能有所帮助。获得右键单击的行以获取上下文菜单时出现问题。我正在使用大纲视图,而不是表格视图,它位于主窗口中,而不是对话框。
我有一个出口到我的观点。在处理菜单的对象中,我有以下方法:
-(void)setSelectionFromClick{
NSInteger theClickedRow = [myOutlineView clickedRow];
NSIndexSet *thisIndexSet = [NSIndexSet indexSetWithIndex:theClickedRow];
[myOutlineView selectRowIndexes:thisIndexSet byExtendingSelection:NO];
}
我在每个菜单操作开始时调用此方法。
无论按下哪个按钮,都会设置单击的行。但选择仅在单击左键时自动更改。顺便说一下,这也适用于按住Control键盘。
答案 1 :(得分:1)
我的解决方案到目前为止似乎是最干净的,它是将NSTableView子类化,并实现其menuForEvent
消息。只需将表视图作为此视图的子类,即可自动获得正确的行为:
@interface CustomTableView : NSTableView
@end
@implementation CustomTableView
- (NSMenu*) menuForEvent:(NSEvent*)event // override
{
// Get to row at point
NSInteger row = [self rowAtPoint:[self convertPoint:event.locationInWindow fromView:nil]];
if (row >= 0) {
// and check whether it is selected
if (NOT [self isRowSelected:row]) {
// No -> select that row
[self selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
}
}
return [super menuForEvent:event];
}
@end
应该与NSOutlineView
类似地工作。
请注意代码如何决定何时突出显示该行。这会紧密模仿您在Finder中可以看到的行为,例如:
但是,这并不完美:仅当用户实际使用上下文菜单中的一项时,Finder才会更改选择。如果用户取消弹出菜单,则选择不会更改。但是,我的代码更改了之前用户从弹出菜单中进行选择的选择。随时对此进行改进,并在此处分享。
答案 2 :(得分:1)
只是@Thomas Tempelmann 解决方案的快速版本。
public class TableViewWithRightClickSelect: NSTableView
{
override open func menu(for event: NSEvent) -> NSMenu?
{
let row = self.row(at: self.convert(event.locationInWindow, from: nil))
if row >= 0
{
self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false)
}
return super.menu(for: event)
}
}
答案 3 :(得分:0)
我认为您应该继承NSTableView并覆盖OnMouseUp和OnMouseDown,以便在右键单击事件时返回左键单击事件。