QT5 无法获得不同的自定义上下文菜单以适用于不同的表

QT5 Cannot get different custom context menus to work for different tables

我正在尝试让多个 (3) 自定义上下文菜单起作用,每个菜单用于不同的 table 视图。

我的代码在调试中工作正常,但在发布时我没有得到不同的上下文菜单 - 我设法得到的最好的是第一个菜单工作(和其他禁用)或移位菜单(即菜单是相对于屏幕左上角的偏移量(不在光标处)。

代码:

void DisplayWidget::Init()
{
    // ParameterData Table
    pLabel_Param            = new QLabel(tr("PARAMETER DATABASE"));
    pTableW_Param           = new QTableWidget(this);
       
    // EmuNameIn Table
    pLabel_EmuNameIn        = new QLabel(tr("EMULATOR NAME IN"));
    pTableW_EmuNameIn       = new QTableWidget(this);
       
    // EmuNameOut Table
    pLabel_EmuNameOut       = new QLabel(tr("EMULATOR NAME OUT"));
    pTableW_EmuNameOut      = new QTableWidget(this);
    
    // Setup context menus
    pTableW_Param->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(pTableW_Param, SIGNAL(customContextMenuRequested(QPoint)), SLOT(customMenuRequested_Param(QPoint)));
    
    pTableW_EmuNameIn->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(pTableW_EmuNameIn, SIGNAL(customContextMenuRequested(QPoint)), SLOT(customMenuRequested_EmuNameIn(QPoint)));
    
    pTableW_EmuNameOut->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(pTableW_EmuNameOut, SIGNAL(customContextMenuRequested(QPoint)), SLOT(customMenuRequested_EmuNameOut(QPoint)));
}


void DisplayWidget::customMenuRequested_Param(QPoint pos) 
{
    if(!pTableW_Param || (sizeOfTable_Param == 0)) return;

    QModelIndex index = pTableW_Param->indexAt(pos);

    QMenu *menuParam = new QMenu(this);
    if(IsEmuValid()) menuParam->addAction(pAct_AddParam);
    menuParam->addAction(pAct_SearchTable_Param);
    menuParam->popup(pTableW_Param->viewport()->mapToGlobal(pos));
}

void DisplayWidget::customMenuRequested_EmuNameIn(QPoint pos) 
{
    if(!pTableW_EmuNameIn || !IsEmuValid() || (sizeOfTable_EmuNameIn == 0)) return;

    QModelIndex index = pTableW_EmuNameIn->indexAt(pos);

    QMenu *menuNameIn = new QMenu(this);
    menuNameIn->addAction(pAct_DeleteFromNameIn);
    menuNameIn->addAction(pAct_Toggle_InToOut);
    menuNameIn->addAction(pAct_SearchTable_EmuNameIn);
    menuNameIn->addAction(pAct_SortTable_EmuNameIn);
    menuNameIn->popup(pTableW_EmuNameIn->viewport()->mapToGlobal(pos));
}

void DisplayWidget::customMenuRequested_EmuNameOut(QPoint pos) 
{
    if(!pTableW_EmuNameOut || !IsEmuValid() || (sizeOfTable_EmuNameOut == 0)) return;

    QModelIndex index = pTableW_EmuNameOut->indexAt(pos);

    QMenu *menuNameOut = new QMenu(this);
    menuNameOut->addAction(pAct_DeleteFromNameOut);
    menuNameOut->addAction(pAct_Toggle_OutToIn);
    menuNameOut->addAction(pAct_SearchTable_EmuNameOut);
    menuNameOut->addAction(pAct_SortTable_EmuNameOut);
    menuNameOut->popup(pTableW_EmuNameOut->viewport()->mapToGlobal(pos));
}

我尝试寻找/搜索相同的问题,但未能解决问题。

虽然我仍然不明白为什么我的代码失败了,但我已经找到了让它工作的方法。

让它工作的方法是换掉以下内容:

menuNameOut->popup(pTableW_EmuNameOut->viewport()->mapToGlobal(pos));
menuNameIn->popup(pTableW_EmuNameIn->viewport()->mapToGlobal(pos));
menuParam->popup(pTableW_Param->viewport()->mapToGlobal(pos));

用于:

menuNameOut->exec(QCursor::pos());
menuNameIn->exec(QCursor::pos());
menuParam->exec(QCursor::pos());