我在 Qt 中连接上下文菜单操作时遇到问题。我知道周围有很多类似的问题,但是我还没有找到解决方案。
我有一系列使用 QCustomplot 构建的图。
我想要做的是在右键单击每个图的背景时创建一个上下文菜单,其中列出了图中存在的所有信号。通过单击此菜单的条目,相应的信号应被隐藏(如果当前可见)或使其可见(如果隐藏)。
现在,我定义了一个名为 PlotHandler 的类,我将相关部分粘贴在下面:
绘图处理器.cpp
#include "plothandler.h"
PlotHandler::PlotHandler(QStringList groupNames, int startIdx, QWidget *parent) :
QWidget(parent), scrolling(false), refreshing(true)
{
pPlot = new QCustomPlot(this);
pPlot->setContextMenuPolicy(Qt::CustomContextMenu);
connect(pPlot, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenuRequest(QPoint)));
}
void PlotHandler::contextMenuRequest(QPoint pos)
{
int i;
QMenu *menu = new QMenu(this);
for(i=0; i<pGroup->getDataLength(); i++)
{
QAction *menuEntry;
menuEntry = new QAction(pPlot->graph(i)->name(), this);
menuEntry->setProperty("graphIdx", i);
menu->addAction(menuEntry);
connect(menuEntry, SIGNAL(triggered()), this, SLOT(addRemoveGraph()));
}
menu->popup(pPlot->mapToGlobal(pos));
}
void PlotHandler::addRemoveGraph()
{
QAction *selectedSignal = qobject_cast<QAction *>(sender());
int tmp = selectedSignal->property("graphIdx").toInt();
if (pPlot->graph(tmp)->visible())
{
pPlot->graph(tmp)->setVisible(false);
}
else
{
pPlot->graph(tmp)->setVisible(true);
}
}
绘图处理器.h
class PlotHandler : public QWidget
{
Q_OBJECT
public:
explicit PlotHandler(QStringList groupNames, int startIdx, QWidget *parent = 0);
QString groupRequested();
private:
QCustomPlot *pPlot;
public slots:
void contextMenuRequest(QPoint pos);
void addRemoveGraph();
}
菜单正确显示正确的条目,当我点击一个动作时addRemoveGraph
。在调试中,它会返回以下消息:
下级停止了,因为它触发了异常。在线程 0 中停止的原因是:0x5d6c2f9a 处的异常,代码:0xc0000005:0x0 处的读取访问冲突,标志 = 0x0。
试图执行
int tmp = selectedSignal->property("graphIdx").toInt();
谁能指出我正确的方向?
提前致谢