【问题标题】:Why is QLineEdit::setCursorPosition(int) selecting(highlighting) text?为什么 QLineEdit::setCursorPosition(int) 选择(突出显示)文本?
【发布时间】:2016-03-09 19:11:38
【问题描述】:

我有一个可编辑的 QComboBox,它允许用户输入新对象的名称并将其添加到列表中。他们还可以编辑列表中现有项目的名称。问题是......假设我在列表中有一个名为“AF”的项目,我想将其重命名为“ABCDEF”。我的第一个问题是,如果我将光标放在“A”和“F”之间并开始输入,在输入 1 个字母后光标会跳到末尾。所以我会得到“ABFCDE”,除非我在输入每个字母后手动移动光标。

我使用

解决了这个问题
// slot connected to textEditChanged(QString) signal from QComboBox
void textChanged(const QString &text)
{
    int pos = QComboBox->lineEdit()->custorPosition();

    stuff...

    QComboBox->setItemText(idx, text);
    QComboBox->lineEdit()->setCursorPosition(pos);
}

这行得通,但不幸的是,这导致了一个新问题。

setCursorPosition 随后将选择(突出显示)新光标位置之外的所有文本。所以在“AF”到“ABCDEF”的例子中......我将光标放在“A”和“F”之间,键入B,光标停留在“AB”之后和“F”之前,但“F”被突出显示。下一次按键将完全取代“F”。它会突出显示超过 1 个字符,它会在光标移动后突出显示光标右侧的每个字符。

我试过这个没有用。

QComboBox->lineEdit()->deselect();

我也尝试了这个作为测试,但它错误地表现出相同的行为。

QComboBox->lineEdit()->moveCursorBackward(false,2);

false 参数应该选择光标移动经过的文本,但无论如何它都会选择。

有人对造成这种情况的原因有任何想法吗?

【问题讨论】:

  • “我的第一个问题是,如果我将光标放在‘A’和‘F’之间并开始键入,光标会在键入 1 个字母后跳到末尾。” => 为什么?你处理其他信号吗?
  • 我永远无法找到。我求助于强制光标位置来解决这个问题。是的,我处理了另外两个信号 QComboBox::currentIndexChanged() 和 QComboBox::editingFinished() 但是在编辑 lineEdit 文本时这些都没有被触发。
  • 错误修复 IMO。除了您所解释的之外,您的组合还有什么特别之处?为什么你的变量命名为QComboBox,这是一个类名......?您是否测试过删除其他信号处理程序?
  • QComboBox 变量名称为 rcsObjectNameCombo。它真的没有什么特别之处。它只保存 rcs 对象的文本名称,并允许用户创建一个新对象。除此之外,它所要做的就是调用函数来更新整个 GUI 的名称。对话框中有大约 20 多个信号处理程序,但只有 3 个与此 QComboBox 相关(上一条评论中提到的那些)。
  • 所以QComboBox->lineEdit() 不是真正的代码?如果您注释掉与组合相关的所有信号处理程序会发生什么?

标签: c++ qt qcombobox qlineedit


【解决方案1】:

我也遇到过这个问题。对于任何有兴趣的人来说,这是为我解决的问题:

首先连接信号,但要确保它已排队!

connect(_comboBox, SIGNAL(editTextChanged(const QString&)), this, SLOT(slotTextChanged(const QString&)), Qt::QueuedConnection);

对于插槽:

void ViewListWidget::slotViewNameChanged(const QString& /*name*/) {
    int index = _viewComboBox->currentIndex();

    int cursorPosition = _viewComboBox->lineEdit()->cursorPosition();

    // Since we are using a queued connection, get the current QLineEdit text
    // instead of relying on the signal argument, which might be out of sync
    QString name = _viewComboBox->lineEdit()->text();

    _viewComboBox->blockSignals(true);
    _viewComboBox->setItemText(index, name);
    _viewComboBox->blockSignals(false);

    _viewComboBox->lineEdit()->setCursorPosition(cursorPosition);
}

您还应该禁用自动完成功能:

_comboBox->setCompleter(0);

【讨论】:

    猜你喜欢
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多