From 5a397e0b89238b15f9f54371dc8a650ec411164b Mon Sep 17 00:00:00 2001 From: tianzhendong <1203886034@qq.com> Date: Thu, 18 Jun 2026 19:15:01 +0800 Subject: [PATCH] =?UTF-8?q?FIX:=E4=BF=AE=E5=A4=8D=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E8=BE=93=E5=85=A5=E4=BC=9A=E6=B8=85=E7=A9=BA=E7=9A=84?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- numkeydia.cpp | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/numkeydia.cpp b/numkeydia.cpp index 8be2553..ee4a152 100644 --- a/numkeydia.cpp +++ b/numkeydia.cpp @@ -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(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() {