C++ 如何防止两次按键呼叫信号?

C++ 如何防止两次按键呼叫信号?,c++,qt,C++,Qt,情况是: 在“创建课程”中,我单击“保存1”按钮(时间1,它调用setUpStep2Action()),它转到步骤2并禁用“保存1”按钮。。。保存所有信息后,我添加了更多课程,所以“Save1”按钮是启用的。当我单击“Save1”按钮(时间2)时,它会调用setUpStep2Action()两次。 我不知道发生了什么以及如何防止这个问题。 谢谢 作废步骤2保存操作(int courseId) { } 我将连接放入构造函数中。以下是创建connect的代码: QSignalMapper *

情况是: 在“创建课程”中,我单击“保存1”按钮(时间1,它调用setUpStep2Action()),它转到步骤2并禁用“保存1”按钮。。。保存所有信息后,我添加了更多课程,所以“Save1”按钮是启用的。当我单击“Save1”按钮(时间2)时,它会调用setUpStep2Action()两次。 我不知道发生了什么以及如何防止这个问题。 谢谢

作废步骤2保存操作(int courseId) {

}

我将连接放入构造函数中。以下是创建connect的代码:

    QSignalMapper *signalMapper1 = new QSignalMapper(this);
    signalMapper1->setMapping(ui.courseNameLineEdit,0);
    QObject::connect(ui.courseNameLineEdit,SIGNAL(returnPressed()),signalMapper1, SLOT(map()));
    QObject::connect(signalMapper1, SIGNAL(mapped(int)),this, SLOT(step1SaveAction(int)));

如RA评论中所述,您可能多次将
clicked()
信号连接到
setUpStep2Action()
插槽。我认为这是因为当您添加课程时,您会执行以下操作:

void addCourse()
{
    // ...
    save1Button->setEnabled(true);
    connect(save1Button, SIGNAL(clicked()),
            this,        SLOT(setUpStep2Action()));
}
因此,每次添加课程时都会添加一个连接。您需要做的是只调用一次
connect
,例如,在包含按钮的类的构造函数中

然后,仅使用以下方法简化您的
addCourse()
方法:

void addCourse()
{
    // ...
    save1Button->setEnabled(true);
}

我非常同意这里的所有评论,即每次单击按钮时都会添加一个新连接。你说你没有。易于测试。有一个不错的、很少使用的连接选项:Qt::UniqueConnection

将您的连接更改为:

bool success = false;
success = QObject::connect(ui.courseNameLineEdit,SIGNAL(returnPressed()),
signalMapper1, SLOT(map()),Qt::UniqueConnection);
if(!success){
  qFatal() << "Connection failed1";
}
sucess = QObject::connect(signalMapper1, SIGNAL(mapped(int)),this, 
SLOT(step1SaveAction(int)),Qt::UniqueConnection);
if(!success){
  qFatal() << "Connection failed2";
}
bool success=false;
success=QObject::connect(ui.courseNameLineEdit,信号(returnPressed()),
signalMapper1,插槽(map()),Qt::UniqueConnection);
如果(!成功){

qFatal()将连接中的最后一个参数作为
Qt::UniqueConnection传递。


QObject::connect(ui.courseNameLineEdit,SIGNAL(returnPressed()),signalMapper1,SLOT(map()),Qt::UniqueConnection);

您可能多次将
单击的信号连接到
设置步骤2动作()
插槽,但除非您发布代码,否则无法判断函数..是的。我确实上传了代码:)谢谢,但这一点不在我的代码中。这可能是QPushButton的工作方式。因为,我第一次“添加课程”,一切都运行良好。第二次“添加课程”,信号(step2SaveAction)运行2次,如果我再尝试一次“添加课程”,信号运行3次。不,相信我和其他人,问题不在于QPushButton的工作方式;-)您没有提供
connect
所在的代码,这有助于我们告诉您出了什么问题。:)我在信号函数之外进行连接(在构造函数中)。我不再调用信号函数中的连接了。:(非常感谢。每次我单击“添加更多”,都会创建一个新的lineEdit with it连接。你说得对。我为它创建了两个连接。“Qt::UniqueConnection”选项似乎不太好用。但我现在知道如何处理它了。:)@ndnguyen
Qt::UniqueConnection
正按照我们希望的方式工作:通知我们已经存在相同的连接
bool success = false;
success = QObject::connect(ui.courseNameLineEdit,SIGNAL(returnPressed()),
signalMapper1, SLOT(map()),Qt::UniqueConnection);
if(!success){
  qFatal() << "Connection failed1";
}
sucess = QObject::connect(signalMapper1, SIGNAL(mapped(int)),this, 
SLOT(step1SaveAction(int)),Qt::UniqueConnection);
if(!success){
  qFatal() << "Connection failed2";
}