我发现了一些类似的问题,但这些似乎是指在插槽处理程序中使用消息框的情况。就我而言,我有点卡住了,因为即使我的插槽处理程序什么都不做,我也收到了两次 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 两次,第一次是失去焦点的框的索引和第二次使用获得焦点的框。
所以我的问题是:我错过了什么吗?这是预期的行为还是错误?如果是错误,任何人都知道解决方法,因为我想在输入数据时使用此信号对数据进行自定义验证(通过返回、制表符或鼠标单击来更改焦点)。