文章

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);
}

2. 清除Layout及其所有子部件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <QtWidgets>

inline void clearLayout(QLayout* layout) {
  while (QLayoutItem* item = layout->takeAt(0)) {
    if (QWidget* widget = item->widget()) {
      widget->deleteLater();
    }

    if (QLayout* childLayout = item->layout()) {
      clearLayout(childLayout);
    }

    if (QSpacerItem* spaerItem = item->spacerItem()) {
      layout->removeItem(spaerItem);
    }

    delete item;
  }
}
本文由作者按照 CC BY 4.0 进行授权