如何防止QPushButton调用信号两次
How to prevent QPushButton call signal two times?
情况如下:在"创建课程"中,我点击"保存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);
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- C++两次定义相同的函数会导致错误
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 使用柯南打包时如何避免列出两次依赖?
- 为什么要执行两次位移((x >> 4)<< 4)?
- QTcpSocket readyRead() 信号发出两次
- 如何防止QPushButton调用信号两次
- 当事件循环在错误槽启动时,ContentNotFoundError发生时,QNetworkReply发出两次错误信号