无法从QCompleter选择项后清除QLineEdit的(Fail to clear QLineE

2019-07-30 20:46发布

使用PopupCompletion模式,当你选择一个项目(使用箭头键),然后按回车键 - lineEdit应该成为空(当按下回报,我清楚lineEdit),但lineEdit不会成为空。 (如果按“Enter”键,将清空lineEdit)。 所以我觉得按回车键不明确lineEdit,但按回车键还告诉QCompleter到选定的项目插入到lineEdit,因此它似乎什么也没有发生。

但是,如果您单击该项目insted的带箭头选择它的 - 一切工作正常。

我试图在互联网上找到解决方案,但我发现只有有同样的问题一个人: http://lists.trolltech.com/qt-interest/2006-10/thread00985-0.html 。 可悲的是没有答案。 请阅读他的问题,因为这将有助于理解我的问题。

如何清洁LineEdit QCompleter插入的选定项目之后? (捕激活信号没有帮助)

Answer 1:

这里的问题是,完成者实际上包含一个弹出,这实际上是一个独立的QAbstractItemView控件(参见QCompleter ::弹出()文档)。 因此,当你按下“确认”键对QCompleter,关键事件实际上进入弹出,而不是行编辑。

有解决您的问题两种不同的方式:

选项1

连接完成者的启动信号线编辑的清除插槽,但做到这一点作为一个QueuedConnection

QObject::connect(completer, SIGNAL(activated(const QString&)),
                 lineEdit, SLOT(clear()),
                 Qt::QueuedConnection);

为什么使用直接连接不工作的原因是因为你基本上依赖于哪些插槽得到从信号调用的顺序上。 使用QueuedConnection解决此得到。 从代码维护的角度来看,我真的不喜欢这种解决方案,因为它是不明确你的意图是仅仅通过看代码是什么。

选项2

写周围的弹出事件过滤器来过滤出“Enter”键显式地清除行编辑。 你的事件过滤器最终会看起来像这样:

class EventFilter : public QObject
{
   Q_OBJECT
public:
   EventFilter(QLineEdit* lineEdit, QObject* parent = NULL)
      :QObject(parent)
      ,mLineEdit(lineEdit)
   { }
   virtual ~EventFilter()
   { }

   bool eventFilter(QObject* watched, QEvent* event)
   {
      QAbstractItemView* view = qobject_cast<QAbstractItemView*>(watched);
      if (event->type() == QEvent::KeyPress)
      {
         QKeyEvent* keyEvent = dynamic_cast<QKeyEvent*>(event);
         if (keyEvent->key() == Qt::Key_Return || 
             keyEvent->key() == Qt::Key_Enter)
         {
            mLineEdit->clear();
            view->hide();
            return true;
         }
      }
      return false;
   }

private:
   QLineEdit* mLineEdit;
};

这样,你会在安装完成者的弹出式的事件过滤器:

EventFilter* filter = new EventFilter(lineEdit);
completer->popup()->installEventFilter(filter);

此选项是更多的工作,但它是为你在做什么更清晰。 此外,您还可以进行其他的定制这种方式,如果你喜欢。



文章来源: Fail to clear QLineEdit after selecting item from QCompleter