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());
我正在尝试让多个 (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());