我有一个可编辑的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参数应该不选择光标移过的文本,但无论如何都会。
任何人对导致这种情况的原因有任何想法吗?
答案 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);
}