如何使QLineEdit在textChanged信号中发出前一个和当前文本

时间:2016-10-12 08:15:01

标签: c++ qt subclassing

我希望将QLineEdit子类化以发出一个新信号,该信号将从获得焦点和新文本的那一刻开始生成文本。

像:

Signals:
  void customTextChanged(const QString& previousText , const QString& currentText);

QLineEdit的目的是编辑项目的名称,如果它存在,则会禁用Ok_button(这在on_text_changed(QString)广告位中完成)。

我想检查一下用户是否改变主意并设置了之前的名字或者他已撤消。

1 个答案:

答案 0 :(得分:3)

感谢peppe

以下子类在聚焦时存储lineEdit文本,然后每当文本更改时检查文本是否与开头的文本相同如果不是,它会发出textEditedCustom(QString)

转到标题!

class customQLineEdit: public QLineEdit
{
  Q_OBJECT
public :
  explicit customQLineEdit(QWidget* parent = 0 );
  explicit customQLineEdit(const QString &str, QWidget* parent=0);

signals:
  void textEditedCustom(const QString& text);

public slots:
  void on_Text_Edited_custom(const QString& currentText);

protected:
  QString previousText;
  virtual void focusInEvent(QFocusEvent* e);
};

和.cpp部分

customQLineEdit::customQLineEdit(QWidget* parent ):
  QLineEdit(parent)
{
  connect(this , SIGNAL(textEdited(QString)) ,
          this , SLOT(on_Text_Edited_custom(QString)));

}

customQLineEdit::customQLineEdit(const QString &str, QWidget* parent):
  QLineEdit(str , parent)
{
  connect(this , SIGNAL(textEdited(QString)) ,
          this , SLOT(on_Text_Edited_custom(QString)));

}


void customQLineEdit::focusInEvent(QFocusEvent* e)
{
  previousText = text();
  QLineEdit::focusInEvent(e);
}

void customQLineEdit::on_Text_Edited_custom(const QString& txt)
{
  if(previousText !=  txt)
    emit textEditedCustom(txt);
}

然后你订阅它:

connect( nameLineEdit , SIGNAL(textEditedCustom(QString)) , 
          this , SLOT(on_nameLineEdit _Changed(const QString &)));