Qt:上下文菜单/与参数连接
Qt: Context menu / connect with parameters
我在Qt中连接上下文菜单操作时遇到问题。我知道周围有很多类似的问题,但我还没有找到解决方案。
我有一系列使用QCustomplot构建的地块。
我想做的是在右键单击每个绘图的背景时创建一个上下文菜单,列出图形中存在的所有信号。通过单击此菜单的条目,相应的信号应被隐藏(如果当前可见)或变为可见(如果隐藏)。
现在,我定义了一个名为PlotHandler的类,我将其相关部分粘贴到下面:
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);
}
}
plotHandler.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,flags=0x0。
尝试执行
int tmp = selectedSignal->property("graphIdx").toInt();
有人能给我指正确的方向吗?
提前感谢
您使用QObject::setProperty
,但QAction
没有名为"graphIdx"的属性。当您尝试从QAction
读取"graphIdx"属性时,您将始终得到一个无效的QVariant
。
int tmp = selectedSignal->property("graphIdx").toInt();
// tmp always is 0;
如果只需要存储一个属性,则可以使用QAction::setData
。否则,请使用QObject::setProperty
在任何QObject
上设置自定义属性。CCD_ 9是CCD_。
下面是解决问题的解决方案。
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->setData(i);
menu->addAction(menuEntry);
}
connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(addRemoveGraph(QAction*)));
menu->popup(pPlot->mapToGlobal(pos));
}
void PlotHandler::addRemoveGraph(QAction *selectedSignal)
{
int tmp = selectedSignal->property("graphIdx").toInt();
if (pPlot->graph(tmp)->visible())
{
pPlot->graph(tmp)->setVisible(false);
}
else
{
pPlot->graph(tmp)->setVisible(true);
}
pPlot->replot();
}
plotHandler.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();
}
感谢大家的帮助。
相关文章:
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- Wt 连接函数,将参数传递给作为连接函数参数的函数
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 使用libpq组织PostgreSQL数据库连接参数
- 如何使用分隔符连接命令行参数
- 当条件为真时,有没有办法连接宏参数
- Qt - 使用λ函数修改先前连接信号的插槽参数
- 使用"const char*"和"char*"参数连接两个第三方模块
- 在参数包中获取函数指针的返回类型,并将其保存为与其他参数连接的元组
- 无法为 QT 连接函数提供参数
- 在可变参数模板函数中连接字符串(和数字)
- Qt用参数将QAction连接到函数
- C++连接函数错误-参数无效
- C++ 将两个字符 * 连接到命令行参数的 LPTSTR
- 为连接的OMNeT++门分配随机选择但匹配的参数
- 正在将QAxObject事件与IDispatch*类型的参数连接
- 将返回对象的信号连接到没有参数的插槽
- c++:将其所有参数连接为字符串的函数
- Qt:上下文菜单/与参数连接
- 宏参数连接不像我预期的那样工作