gpt4 book ai didi

c++ - QLineEdit editingFinished信号在改变焦点时两次?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:41 29 4
gpt4 key购买 nike

我发现了几个类似的问题,但这些问题似乎是指在插槽处理程序中使用消息框的情况。在我的例子中,我有点卡住了,因为即使我的插槽处理程序什么都不做,我还是收到了两次 editFinished 信号。

为了测试,我有一个 QLineEdit 数组,它使用 signalMapper 将 editingFinished() 信号连接到单个插槽。 signalMapper 传递数组索引,这样我就可以看到信号来自哪里。例如:

testenter::testenter(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::testenter)
{
// setup the UI according to the .h file
ui->setupUi(this);

signalMapper = new QSignalMapper(this);

// init the labels and edit boxes
for (int i = 0; i < 10; i++)
{
pm_label[i] = new QLabel(ui->scrollArea);
QString text = QString("Number %1").arg(i);
pm_label[i]->setText(text);
pm_label[i]->setGeometry(10,20+i*30, 50, 20);
pm_label[i]->show();

pm_editBox[i] = new QLineEdit(ui->scrollArea);
pm_editBox[i]->setGeometry(80,20+i*30, 50, 20);
pm_editBox[i]->show();

signalMapper->setMapping(pm_editBox[i], int(i));
connect(pm_editBox[i], SIGNAL(editingFinished()), signalMapper, SLOT(map()));
}
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(data_entry(int)));
}

void testenter::data_entry(int entry)
{
//dummy
}

在调试器中运行时,如果我将数据输入到一个框中,然后按回车键或用鼠标选择另一个框(即更改焦点),然后它会调用 data_entry 两次,第一次是丢失框的索引焦点和第二次获得焦点的框。

所以我的问题是:我错过了什么吗?这是预期的行为还是错误?如果出现错误,任何人都知道解决它的方法,因为我想在输入数据时使用此信号对数据进行自定义验证(通过返回、制表符或鼠标单击以更改焦点)。

最佳答案

首先,不,这不是预期的行为,即选择 QLineEdit 不应导致发出 editingFinished 信号。

有几种情况可能会导致此问题:

  • 你不小心将一个信号连接到一个插槽上
  • 插槽 map() 导致新选择的框失去焦点
  • 同样徒劳,如果您正在调试并使用断点来检测何时调用插槽,您可能会导致 QLineEdit 在事件应用程序从您的 QWidget 到您的调试器,再次导致信号再次发送。

如果您因为双连接槽而遇到问题,但情况似乎并非如此,因为您专门从两个不同的 QLineEdit 获取信号,您可以确保通过指定连接类型不会发生这种情况,connect 方法实际上在末尾有一个额外的可选参数,它允许您将类型从 DefaultConnection 更改为唯一连接

也就是说,数据验证是 Qt 已经建立的机制,我建议您尽可能使用它,研究扩展 QValidator 抽象基类 Ref Doc .然后,您告诉每个 QLineEdit 使用相同的 validator

关于c++ - QLineEdit editingFinished信号在改变焦点时两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26782211/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com