您好我正在使用OnInitDialog:
::SetWindowTheme(GetDlgItem(IDC_RADIO1)->GetSafeHwnd(), L"wstr", L"wstr");
HBRUSH CMFCApplication1Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
// Call the base class implementation first! Otherwise, it may
// undo what we're trying to accomplish here.
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// Are we painting the IDC_MYSTATIC control? We can use
// CWnd::GetDlgCtrlID() to perform the most efficient test.
if (pWnd->GetDlgCtrlID() == IDC_RADIO1)
{
// Set the text color to red
pDC->SetTextColor(RGB(255, 0, 0));
// Set the background mode for text to transparent
// so background will show thru.
pDC->SetBkMode(TRANSPARENT);
// Return handle to our CBrush object
hbr = m_brush;
}
return hbr;
}
自定义项委托。
我在委托中使用QTableView
来显示上下文菜单,该菜单对于右键单击的每个项目都是不同的。
使用editorEvent
显示菜单。
问题在于,当我右键单击未选中的单元格时,菜单会显示(阻止),并且只有在菜单消失后才会选择单元格。 这是因为代理首先捕获鼠标单击,然后传播到视图以进行选择。
我可以尝试哪种替代/解决方法?
QMenu::exec()
在我的情况下不起作用,我认为因为点击传播会关闭菜单; 修改
我确实抓住了QMenu::popup()
。使用QEvent::MouseButtonPress
代替首先选择单元格,然后显示上下文,但是如果在按下按钮的同时移动鼠标,则选择保留在您按下按钮的位置,同时按钮被释放的单元格出现上下文菜单。
我认为解决此问题的唯一方法是将此代码移出代理,如下所示。
答案 0 :(得分:2)
如果您只需要在用户右键单击时显示菜单,则无需创建自定义项目委托。
您可以在mouseReleaseEvent
时处理event->button() == Qt::RightButton
并使用QTableView::selectionModel()
获取所选项目。
希望它有所帮助。
答案 1 :(得分:2)
正如cdonts所建议的,使用委托来显示上下文菜单不仅不需要,而且表现也不佳。
我使用的是QWidget::setContextMenuPolicy(Qt::CustomContextMenu)
和信号QWidget::customContextMenuRequested(QPoint)
。这允许我在创建上下文菜单之前检查实际选择,询问视图的SelectionModel(可以在模型中完成,以便轻松自定义菜单并相应地编辑数据)。
请记住使用QTableView->viewport()->maptoglobalpos(point)
获取菜单应显示的全局坐标。