我正在尝试检测 wxWidgets (C++) 中
wxAuiNotebook
中选项卡的双击。但是,我在wxAuiNotebook事件系统中找不到与此操作对应的任何事件。
在 wxPython 中,有一个名为
wxEVT_AUINOTEBOOK_TAB_DCLICK
的事件,属于 wx.lib.agw.aui.auibook.AuiNotebook
类,该事件处理笔记本选项卡上的双击,但我需要 C++ 中的 wxWidgets 类似的东西。
为了更好地理解,这是我想在双击图中所示的选项卡之一时运行的事件。
我尝试使用
auiNotebook->HitTest(position)
以及双击发生时从鼠标事件获得的位置来检测双击,但它似乎不起作用。在wxWidgets中有什么办法可以实现这一点吗?
我如何实现此功能,或者是否存在我可能会丢失的现有事件?
编辑: 我已经成功获取点击事件,但仍然无法正常工作 你可以看到问题
void SuperNotebook::OnPageChanged(wxAuiNotebookEvent& event)
{
wxSize notebookSize = GetSize();
int width = notebookSize.GetWidth();
int height = notebookSize.GetHeight();
int step = 10;
for (int x = 0; x < width; x += step)
{
for (int y = 0; y < height; y += step)
{
wxPoint point(x, y);
wxAuiTabCtrl* tabCtrl = GetTabCtrlFromPoint(point);
if (tabCtrl)
{
tabCtrl->Bind(wxEVT_LEFT_DCLICK, &SuperNotebook::OnTabDoubleClick, this);
}
}
}
event.Skip();
}
void SuperNotebook::OnTabDoubleClick(wxMouseEvent& event)
{
wxPoint pos = event.GetPosition();
console->Print(wxString::Format("Clicked On: X: % d, Y : % d", pos.x, pos.y), MessageType::Information);
int tabIndex = HitTest(pos);
if (tabIndex != wxNOT_FOUND)
{
wxString tabName = GetPageText(tabIndex);
console->Print(wxString::Format("Tab name: %s\n", tabName), MessageType::Good);
}
}
没有检测选项卡点击的事件。我以一种非常规的方式处理了这件事。首先,我从
wxAuiGenericTabArt
类派生了一个新类,并覆盖了 DrawTab
方法,并在该方法中添加了这些行:
//------------------For tab double-click event------------------//
wxPoint mousePos = wxGetMousePosition();
wxPoint relativeMousePos = wnd->ScreenToClient(mousePos);
if (in_rect.Contains(relativeMousePos)) {
if (wxGetMouseState().LeftIsDown()) {
m_notebook->SetSelectedPage(&page);
}
}
else {
m_notebook->SetSelectedPage(nullptr);
}
这里,
m_notebook
是我从wxAuiNotebook
派生的自定义类,其中包含SetSelectedPage
方法。
然后,在从 wxAuiNotebook
派生的类中,我使用 Bind
将 wxEVT_LEFT_DCLICK 事件与处理 OnPageChange
或 OnPageChanging
等事件的方法中的 TabCtrls相关联。之后,我设法捕获双击了哪个选项卡,如下所示:
void CustomNotebook::OnTabDoubleClick(wxMouseEvent& event)
{
wxPoint pos = event.GetPosition();
int tabIndex = HitTest(pos);
if (tabIndex != wxNOT_FOUND)
{
if (selectedPage)
{
//In here I can get
}
}
}
需要注意的是,这是一种复杂的方法,在找到更好的解决方案之前,这是最好的解决方案。