首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt QAction动态数组连接

Qt QAction动态数组连接
EN

Stack Overflow用户
提问于 2012-11-26 10:30:07
回答 1查看 1.2K关注 0票数 3

我想创建一个包含可检查的QAction对象的QMenu。一旦一个动作被选中,它就会触发并允许绘制一些3D对象。但是,3D对象的数量取决于要加载的文件。因此,此QMenu具有动态数量的QAction对象。假设我们有10个3D对象,名称为"1","2",... "10“,因此QMenu中的QAction对象将显示为"1","2",... "10”。选中其中之一时,将启用该名称的3D对象显示。

生成动态QAction对象的代码:

代码语言:javascript
复制
QStringList labels = defaultScene->getLabels();
for(int i=0; i<labels.size(); i++){
     QAction* labelAction = new QAction(labels[i], this);
     labelAction->setToolTip("Trace Marker " + labels[i]);
     labelAction->setStatusTip("Trace Marker " + labels[i]);
     labelAction->setCheckable(true);
     traceMenu->addAction(labelAction);
}

我的问题是,如何连接这些QAction对象?具体地说,我在defaultScene中有一个布尔数组,它将随着QAction的切换而切换。我如何知道哪个QAction正在触发?QAction on切换的信号仅通过布尔值。理想情况下,我在defaultScene中只有一个函数:

代码语言:javascript
复制
void toggleObject3D(int index){
     if(index >= 0 && index < visibleSize){
          visible[index] = !visible[index];
     }
}

因此,要使其工作,我需要来自traceMenu的某种信号,它将触发一个整型变量。我不知道有这样的信号。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-26 14:05:33

您可以使用QSignalMapper (Link in the documentation)

其思想是将每个QAction与一个索引相关联,然后使用来自QSignalMapper的映射(Int)信号。当然,我们需要映射切换后的信号。

因此,首先,将方法toggleObject3D定义为一个插槽。

然后,在生成QAction实例时,创建QSignalMapper并将每个操作与其关联:

代码语言:javascript
复制
QStringList labels = defaultScene->getLabels();
QSignalMapper *mapper = new QSignalMapper(this);
for(int i=0; i<labels.size(); i++){
   QAction* labelAction = new QAction(labels[i], this);
   labelAction->setToolTip("Trace Marker " + labels[i]);
   labelAction->setStatusTip("Trace Marker " + labels[i]);
   labelAction->setCheckable(true);
   traceMenu->addAction(labelAction);

   // Map this action to index i
   mapper->setMapping(labelAction, i);
   // Associate the toggled signal to map slot from the mapper
   // (it does not matter if we don't use the bool parameter from the signal)
   connect(action, SIGNAL(toggled(bool)), mapper, SLOT(map()));
}

// Connect the QSignalMapper map() signal to your method
connect(mapper, SIGNAL(mapped(int)), this, SLOT(toggleObject3D(int)));

它应该是有效的:)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13557886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档