【发布时间】: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