文章

Qt 笔记

1. 控件的 eventFilter

如下代码,将为edtCleanCount部件安装一个事件过滤器,当用户按下UpDown键时,并且参数objedtCleanCount时,会自动修改edtCleanCount的值。 也可以继承QLineEdit类,重写keyPressEvent方法,实现相同的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// eventFilter 声明
// bool eventFilter(QObject* obj, QEvent* event) override;

// init 
void MyDialog::init() {
  // 设置只允许edtCleanCount输入数字
  QValidator* validator = new QRegExpValidator(QRegExp("[0-9]+"), this);
  ui->edtCleanCount->setValidator(validator);

  //在编辑器部件安装事件过滤器
  ui->edtCleanCount->installEventFilter(this);
}

bool MyDialog::eventFilter(QObject* obj, QEvent* event) {
  if (obj == ui->edtCleanCount && event->type() == QEvent::KeyPress) {
    QKeyEvent* key_event = static_cast<QKeyEvent*>(event);
    const auto key = key_event->key();
    if (key == Qt::Key_Up || key == Qt::Key_Down) {
      auto flag = (key == Qt::Key_Up) ? 1 : -1;
      auto clean_count = ui->edtCleanCount->text().toInt() + flag;
      clean_count = std::max(clean_count, 0);  // 最小值为0
      ui->edtCleanCount->setText(QString::number(clean_count));
      return true;
    }
  }

  return QWidget::eventFilter(obj, event);
}
本文由作者按照 CC BY 4.0 进行授权