当我单击子菜单项列表时,我正在开发一个代码片段来执行类似的、不同的操作。请检查附加的快照。QSignalMapper 是将多个信号连接到同一个插槽的最佳解决方案。
但是我无法准确定位哪个信号要为哪个插槽调用。我已经阅读了很多关于 QSignalMapper 的理论,
http://qt-project.org/doc/qt-4.8/qsignalmapper.html
http://doc.qt.digia.com/qq/qq10-signalmapper.html#thesignalmapperapproach
甚至实现了他们的代码。与提到的示例程序不同,我的 QAction 对象显然不能像我们在数组中定义元素那样定义,因为它们的名称是由设计窗口自动生成的。
我无法理解,我应该在此处放置什么作为 SIGNAL,以及何时应该使用 setMapping 函数?如果我使用 setMapping 函数,我应该实现哪些参数?我只是没有彻底了解这个概念,不知道该做什么,该问谁,并在我的代码中犯了错误。你能告诉我我做错了什么吗?我检查了这个以供参考,因为他有类似的问题:
https://stackoverflow.com/questions/14151443/how-to-pass-a-qstring-to-a-qt-slot-from-a-qmenu-via-qsignalmapper-or-otherwise/14157471#14157471
***********************************更新部分(截至 2014 年 3 月 3 日)**** ****************************************************** ******************
我的问题与以下问题非常相似: 如何将 QActions 列表添加到 QMenu 并使用单个插槽处理它们?
我也尝试使用 setData in helpAction(QAction *pAction)
,但我仍然错了,因为当我单击区域阈值子菜单中的操作项时,我得到的唯一值是
0
所以我更新的问题是,如何使用setData(const QVariant &userData)
为我的操作项分配索引。请指教。
主窗口.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDebug>
#include <QSignalMapper>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void subMenuForThresholds();
private:
Ui::MainWindow *ui;
void createActions();
QSignalMapper *pSignalMapper;
private slots:
void interval();
void help();
void helpAction(QAction *pAction);
void setAreathreshold(int value);
};
#endif // MAINWINDOW_H
主窗口.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "intervaldialog.h"
#include "help.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
createActions();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::createActions()
{
ui->actionInterval->setStatusTip(tr("Set the interval for capturing delta & reference images"));
connect(ui->actionInterval, SIGNAL(triggered()), this, SLOT(interval()));
subMenuForThresholds();
ui->menuHelp->setStatusTip(tr("help "));
// connect(ui->menuHelp, SIGNAL(triggered(QAction*)), this, SLOT(help()));
}
void MainWindow::subMenuForThresholds()
{
pSignalMapper = new QSignalMapper(this);
// connect(pSignalMapper, SIGNAL(mapped(int)), this, SIGNAL(/*not sure what to place here?*/);
connect(ui->menuArea_Threshold, SIGNAL(triggered(QAction*)), this, SLOT(helpAction(QAction*)));
}
void MainWindow::setAreaThreshold()
{
qDebug()<<value;
}
void MainWindow::interval()
{
qDebug()<<"inside interval qdialog";
Help help;
help.exec();
}
void MainWindow::help()
{
qDebug()<<"inside help qdialog";
Help help;
help.exec();
}
void MainWindow::helpAction(QAction *pAction)
{
ui->action25_sec->setData(10);
int value = pAction->data().toInt();
qDebug()<<value;
}