如何防止QPushButton调用信号两次

How to prevent QPushButton call signal two times?

本文关键字:两次 信号 何防止 QPushButton 调用      更新时间:2023-10-16

情况如下:在"创建课程"中,我点击"保存1"按钮(时间1,它调用setUpStep2Action()),它进入步骤2并禁用"保存1)按钮。。。保存所有信息后,我添加了更多的课程,所以"Save1"按钮是启用的。当我点击"保存1"按钮(时间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)));

我非常同意这里的所有评论,即每次单击按钮都会添加一个新的连接。你说你没有。易于测试。有一个很好的,很少使用的连接选项: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。但不管怎样,还是要用你们所有的关系做上面的事情。

正如RA的评论中所说,您可能多次将clicked()信号连接到setUpStep2Action()插槽。我想发生这种情况是因为当你添加一个课程时,你会做一些类似的事情:

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

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

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

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

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

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