Qt 笔记及开源库收集
1. 控件的 eventFilter
如下代码,将为edtCleanCount部件安装一个事件过滤器,当用户按下Up或Down键时,并且参数obj为edtCleanCount时,会自动修改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;
  }
}
QT 开源库收集
- QaterialHotReload
- Qt Advanced Docking System
- SARibbon – 类MS Office界面框架
- ElaWidgetTools
- Qt Material Icons Library
- QtSerialMonitor
其他资源收集
 本文由作者按照  CC BY 4.0  进行授权