【问题标题】:Signal editTextChanged for editable QComboBox sets cursor position at end after setEditText可编辑 QComboBox 的信号 editTextChanged 在 setEditText 之后将光标位置设置在末尾
【发布时间】:2016-11-15 14:03:51
【问题描述】:
  1. 有可编辑的 QComboxBox。它可以很好地处理所有功能,除了我们在结尾以外的位置编辑/插入/删除字符串的字符的情况。 例如"Hello" ,如果我们删除 'e' 光标到达末尾。
  2. 目前 editTextChanged(string) 信号处理是这样的,其中 setEditText(string) 已被调用,导致光标到达末尾。
  3. 已经浏览了其他一些人们建议使用的 stackoverflow 论坛 -> 保存初始光标位置,然后调用 setEditText 然后将光标重置到保存的位置。这看起来不错,但看起来像是解决方法。
  4. 想知道是否有其他方法可以 i) 在失去焦点时调用 setEditText。(QFocusEvent 将不起作用,因为派生类继承自 QObject 而不是 QWidget)或 ii) 调用 comboBox->lineEdit 功能来执行 setEditText。 在下面尝试但它不起作用 connect(qcomboBox->lineEdit(), SIGNAL(editingFinished()), this, SLOT(textChanged()));

以下是我浏览过的链接 1)editFinished for editable comboBox 2)saving cursor postion

【问题讨论】:

    标签: c++ qt cursor qcombobox


    【解决方案1】:

    您可以在 QComboBox 上安装一个事件过滤器,并以这种方式检测其焦点输入/输出事件。在文档中查找 QObject::installEventFilter;使用起来非常简单。

    QComboBox 收到的所有事件都将首先通过您的班级,如果有的话,您可以决定如何处理它们。这使您能够从另一个类(您的)更改一个类的行为(即 QComboBox),而无需继承 QComboBox。

    【讨论】:

    • goug,我无法在正确的位置调用 QObject::installEventFilter。我有存档库(.a),应该调用事件过滤器方法。但是安装可以发生在主应用程序/库级别。尝试在应用程序和库中安装事件过滤器,但它不起作用。事件过滤函数永远不会被命中。
    • 我不明白“在应用程序和库中安装”。您将它安装在要监视的对象上,参数是指向将进行监视的对象的指针。所以是的,只要你有指向这两个对象的指针,你就可以在任何你想要的地方调用 installEventFilter,它就可以工作。就个人而言,我倾向于在我正在编写的类中进行监控,但这只是为了方便。
    • 我曾经犯的另一个错误是我在编写的类中对 eventFilter 方法的声明不正确。它是一个虚函数,并且您正在重新定义它,因此要使其正常工作,声明必须与文档中的完全一致。就我而言,我不小心在它的末尾添加了“const”,所以它从未被调用过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2011-05-31
    相关资源
    最近更新 更多