如何防止QPushButton呼叫信号两次?

时间:2013-08-29 03:51:07

标签: c++ qt

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

void step2SaveAction(int courseId) {

  int numElement = ui.rightWidget->count();
  if(numElement == 0)
  {
    QMessageBox::warning(this,tr("Skill choice"),tr("Please choose skills!!"));
    return;
  }

  char* method = "CREATE";
 if ( courseId !=0)
    method = "EDIT";

 setup4Step3(method,courseId,numElement );
 ui.addMoreButton->setVisible(true);

}

我把连接放在构造函数中。这是我创建连接的代码:

    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)));

3 个答案:

答案 0 :(得分:0)

如RA发表的评论中所述,您可能会多次将clicked()信号连接到setUpStep2Action()广告位。我想这是因为当你添加课程时,你会做类似的事情:

void addCourse()
{
    // ...
    save1Button->setEnabled(true);
    connect(save1Button, SIGNAL(clicked()),
            this,        SLOT(setUpStep2Action()));
}

因此,每次添加课程时都会添加一个连接。你需要做的只是在包含按钮的类的构造函数中只调用connect一次。

然后仅使用以下内容简化addCourse()方法:

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

答案 1 :(得分:0)

我非常同意这里的所有评论,每次点击按钮都会添加新连接。你说你没有。易于测试。有一个很好的,很少使用的连接选项: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";
}

如果你是对的并且你的计划继续运行,我们必须集思广益。 : - )

是的......你没告诉我们关于按钮的事吗?您连接连接LineEdit。但是,尽管如此,还要用你所有的联系做上面的事情。

答案 2 :(得分:0)

将连接中的最后一个参数传递为Qt::UniqueConnection.

喜欢

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