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;
}
}
本文由作者按照 CC BY 4.0 进行授权