为什么QLineEdit :: setCursorPosition(int)选择(突出显示)文本?

时间:2016-03-09 19:11:39

标签: c++ qt qcombobox qlineedit

我有一个可编辑的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'。它将突出显示多个字符,它会在移动光标后突出显示光标右侧的每个字符。

我试过这个无济于事。

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

我也尝试过这只是一个测试,它错误地表现出相同的行为。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

$status_array[ $row["Status"] ];

并针对广告位:

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);
}