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

问题描述 投票:0回答:1

我有一个可编辑的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);

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

任何人都有什么想法导致这个?

c++ qt qcombobox qlineedit
1个回答
0
投票

我也遇到过这个问题。以下是任何有兴趣的人为我解决的问题:

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

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);
© www.soinside.com 2019 - 2024. All rights reserved.