FIX:修复第一次输入会清空的bug
This commit is contained in:
+23
-9
@@ -224,6 +224,9 @@ void NumKeyDia::on_btn_back_clicked() {
|
|||||||
d->ui->lineEdit_input->setFocus();
|
d->ui->lineEdit_input->setFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 数字/符号输入按钮统一入口:根据 QLineEdit 当前光标和选区执行插入或替换。
|
||||||
|
// 设计意图:保持触屏软键盘与普通编辑框一致,首次输入不再隐式清空已有内容;
|
||||||
|
// 边界条件:无选区时在光标处插入,部分/全部选中时仅替换选区,按钮信号在 GUI 线程内处理。
|
||||||
void NumKeyDia::btn_input_clicked() {
|
void NumKeyDia::btn_input_clicked() {
|
||||||
Q_D(NumKeyDia);
|
Q_D(NumKeyDia);
|
||||||
auto *btn = qobject_cast<QPushButton *>(sender());
|
auto *btn = qobject_cast<QPushButton *>(sender());
|
||||||
@@ -238,20 +241,31 @@ void NumKeyDia::btn_input_clicked() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d->m_firstInputFlag) {
|
const QString input = btn->property("inputValue").toString();
|
||||||
d->ui->lineEdit_input->clear();
|
|
||||||
d->m_firstInputFlag = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString input = btn->property("inputValue").toString();
|
|
||||||
if (input.isEmpty()) return;
|
if (input.isEmpty()) return;
|
||||||
|
|
||||||
int index = d->ui->lineEdit_input->cursorPosition();
|
// 数字键盘按钮点击发生在 GUI 线程内,这里只同步读取当前 QLineEdit 的光标和选区状态,
|
||||||
|
// 不缓存 QObject 指针到异步流程,避免弹窗复用时选区状态被旧的首次输入标记误清空。
|
||||||
QString text = d->ui->lineEdit_input->text();
|
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->setText(text);
|
||||||
d->ui->lineEdit_input->setFocus();
|
d->ui->lineEdit_input->setFocus();
|
||||||
d->ui->lineEdit_input->setCursorPosition(index + input.size());
|
d->ui->lineEdit_input->setCursorPosition(insertIndex + input.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void NumKeyDia::closeKeyBoard() {
|
void NumKeyDia::closeKeyBoard() {
|
||||||
|
|||||||
Reference in New Issue
Block a user