QToolButton未切换QTextCharFormat::setFontStrikeOut(),无选中文本时后续输入不生效
你的核心问题是:无选中文本时,仅通过QTextCursor::setCharFormat无法更新QTextEdit的默认输入格式,导致后续输入不会继承删除线设置。以下是修正方案:
修正后的切换逻辑代码
void MainWindow::on_toolButtonStrikethrough_toggled(bool checked) { QTextEdit* textEdit = ui->textEditDisplay; QTextCursor cursor = textEdit->textCursor(); QTextCharFormat charFormat = textEdit->currentCharFormat(); // 直接根据按钮勾选状态设置删除线,保证状态完全同步 charFormat.setFontStrikeOut(checked); if (cursor.hasSelection()) { // 有选中文本:为选中区域应用格式 cursor.setCharFormat(charFormat); } else { // 无选中文本:更新编辑器的当前字符格式,让后续输入自动继承该格式 textEdit->setCurrentCharFormat(charFormat); // 同步光标位置的格式(确保光标所在位置的格式与当前设置一致) cursor.setCharFormat(charFormat); } // 重新设置光标,确保所有状态生效 textEdit->setTextCursor(cursor); }
关键修正点
- 区分选区状态处理:
- 有选中文本时,直接通过光标为选中区域设置格式,保留原逻辑
- 无选中文本时,调用
QTextEdit::setCurrentCharFormat更新编辑器的默认输入格式,这是让后续输入继承删除线的核心操作
- 按钮状态与格式强绑定:
原代码中用!format.fontStrikeOut()切换状态,可能导致按钮勾选状态与实际格式不同步。现在直接使用按钮的checked参数设置删除线,确保两者完全一致
额外优化:实时同步按钮与光标位置格式
如果需要按钮的勾选状态实时反映光标所在位置的删除线状态(符合你需求中“勾选状态显示光标位置是否启用删除线”的要求),可以绑定textEdit的cursorPositionChanged信号:
void MainWindow::on_textEditDisplay_cursorPositionChanged() { QTextCharFormat currentFormat = ui->textEditDisplay->currentCharFormat(); ui->toolButtonStrikethrough->setChecked(currentFormat.fontStrikeOut()); }
绑定后,当光标移动到不同格式的文本上时,按钮会自动切换勾选状态,完全匹配当前光标位置的格式。
内容的提问来源于stack exchange,提问作者SirDotJ
相关产品推荐
相关产品推荐

