FIX:修复第一次输入会清空的bug

This commit is contained in:
2026-06-18 19:15:01 +08:00
parent a794ea7574
commit 5a397e0b89
+23 -9
View File
@@ -224,6 +224,9 @@ void NumKeyDia::on_btn_back_clicked() {
d->ui->lineEdit_input->setFocus();
}
// 数字/符号输入按钮统一入口:根据 QLineEdit 当前光标和选区执行插入或替换。
// 设计意图:保持触屏软键盘与普通编辑框一致,首次输入不再隐式清空已有内容;
// 边界条件:无选区时在光标处插入,部分/全部选中时仅替换选区,按钮信号在 GUI 线程内处理。
void NumKeyDia::btn_input_clicked() {
Q_D(NumKeyDia);
auto *btn = qobject_cast<QPushButton *>(sender());
@@ -238,20 +241,31 @@ void NumKeyDia::btn_input_clicked() {
return;
}
if (d->m_firstInputFlag) {
d->ui->lineEdit_input->clear();
d->m_firstInputFlag = false;
}
QString input = btn->property("inputValue").toString();
const QString input = btn->property("inputValue").toString();
if (input.isEmpty()) return;
int index = d->ui->lineEdit_input->cursorPosition();
// 数字键盘按钮点击发生在 GUI 线程内,这里只同步读取当前 QLineEdit 的光标和选区状态,
// 不缓存 QObject 指针到异步流程,避免弹窗复用时选区状态被旧的首次输入标记误清空。
QString text = d->ui->lineEdit_input->text();
text.insert(index, input);
const int cursorIndex = d->ui->lineEdit_input->cursorPosition();
const bool hasSelection = d->ui->lineEdit_input->hasSelectedText();
const int selectionStart = d->ui->lineEdit_input->selectionStart();
const int selectedLength = d->ui->lineEdit_input->selectedText().size();
int insertIndex = cursorIndex;
if (hasSelection && selectionStart >= 0) {
// 有选区时仅替换选中范围;全选只是该规则的边界情况,不再依赖首次输入清空整行。
text.replace(selectionStart, selectedLength, input);
insertIndex = selectionStart;
} else {
// 无选区时保持普通编辑语义,在当前光标处插入,支持末尾追加和中间补字符。
text.insert(insertIndex, input);
}
d->m_firstInputFlag = false;
d->ui->lineEdit_input->setText(text);
d->ui->lineEdit_input->setFocus();
d->ui->lineEdit_input->setCursorPosition(index + input.size());
d->ui->lineEdit_input->setCursorPosition(insertIndex + input.size());
}
void NumKeyDia::closeKeyBoard() {