Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt QAction动态阵列连接_C++_Qt_User Interface - Fatal编程技术网

C++ Qt QAction动态阵列连接

C++ Qt QAction动态阵列连接,c++,qt,user-interface,C++,Qt,User Interface,我想创建一个QMenu,其中包含可检查的QAction对象。一旦选中某个动作,它将触发并启用某些三维对象的绘制。但是,三维对象的数量取决于要加载的文件。因此,此QMenu具有动态数量的QAction对象。假设我们有10个名为“1”、“2”的3D对象。。。“10”,因此QMenu中的QAction对象将显示为“1”、“2”。。。"10". 选中其中一个后,将启用该名称的三维对象显示 生成动态QAction对象的代码: QStringList labels = defaultScene->ge

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

生成动态QAction对象的代码:

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);
}
QStringList labels=defaultScene->getLabels();
对于(int i=0;isetToolTip(“跟踪标记”+标签[i]);
labelAction->SetStatusIP(“跟踪标记”+标签[i]);
labelAction->setCheckable(真);
traceMenu->addAction(labelAction);
}
我的问题是,如何连接这些QAction对象?具体来说,我在defaultScene中有一个bool数组,当QAction被切换时,该数组将被切换。我如何知道哪个QAction正在触发?QAction on toggle的信号只通过一个bool。理想情况下,我在defaultScene中只有一个函数:

void toggleObject3D(int index){
     if(index >= 0 && index < visibleSize){
          visible[index] = !visible[index];
     }
}
void toggleObject3D(int索引){
如果(索引>=0&&index

因此,为了实现这一点,我需要来自traceMenu的某种信号来触发一个int变量。我不知道这种信号。

您可以使用
QSignalMapper
()

其思想是将每个QAction与一个索引相关联,然后使用来自QSignalMapper的映射(int)信号

首先,将您的方法toggleObject3D定义为一个插槽

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

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)));
QStringList labels=defaultScene->getLabels();
QSignalMapper*mapper=新的QSignalMapper(此);
对于(int i=0;isetToolTip(“跟踪标记”+标签[i]);
labelAction->SetStatusIP(“跟踪标记”+标签[i]);
labelAction->setCheckable(真);
traceMenu->addAction(labelAction);
//将此操作映射到索引i
映射器->设置映射(labelAction,i);
//将切换信号与映射器中的映射槽相关联
//(不使用信号中的bool参数并不重要)
连接(动作、信号(切换(bool))、映射器、插槽(映射());
}
//将QSignalMapper map()信号连接到方法
连接(映射器,信号(映射(int)),此,插槽(toggleObject3D(int));
它应该会起作用:)