(195) 本节例题的代码实现 :
++ 本程序的构造函数 :
++ 老师讲构造函数里是有 bug 的,应该为数据成员 m_itemView 赋初值的。
++
++上面调用了自定义函数 refreshToUI ,实现它 :
++继续实现复选框和组合框的信号函数 :
(196) 完善视图的删除功能,由键盘按键引导与触发的删除 :
++源代码版本 :
//virtual bool QObject:: eventFilter(QObject * watched, QEvent * event);
// void QObject::installEventFilter(QObject * filterObj);
//事件过滤器处理事件,处理各 item组件的删除操作。仅仅响应视图上的 delete按键以完成删除条目
bool Widget::eventFilter(QObject * watched, QEvent * event)
{ //enum QEvent :: Type { KeyPress = 6, KeyRelease = 7, };
if (event->type() != QEvent::KeyPress) //不是KeyPress事件,退出
return QWidget::eventFilter(watched,event);
//class QInputEvent : public QEvent { ... };
//class QKeyEvent : public QInputEvent { ... };
QKeyEvent * keyEvent = static_cast<QKeyEvent *>(event);
//enum Key { Key_Delete = 0x01000007, };
//int QKeyEvent::key() const { return m_key ; }
if (keyEvent->key() != Qt::Key_Delete) //若按下的不是 Delete键,退出
return QWidget::eventFilter(watched, event);
if (watched == ui->listSource) //int QListWidget::currentRow() const;
{ QListWidgetItem * item = ui->listSource->takeItem(ui->listSource->currentRow());
delete item; //QListWidgetItem * QListWidget::takeItem(int row);
}
else if (watched == ui->listWidget)
{ QListWidgetItem * item = ui->listWidget->takeItem(ui->listWidget->currentRow());
delete item;
}
else if (watched == ui->treeWidget) //树视图删除的复杂是因为要递归删除。子节点可能还是子树。
{ //QTreeWidgetltem * QTreeWidget::currentItem() const
QTreeWidgetItem * curItem = ui->treeWidget->currentItem();
if (curItem->parent() != nullptr)
{ //QTreeWidgetltem * QTreeWidgetItem::parent () const //返回树视图里某条目的父条目
QTreeWidgetItem * parItem = curItem->parent();
//void QTreeWidgetItem::removeChild(QTreeWidgetItem * child);
//经 remove后的条目的内存空间仍然在,需 delete显式删除。因为子条目还可能是一棵树。
parItem->removeChild(curItem);
}
else //int QTreeWidget::indexOflopLevelItem(QTreeWidgetItem * item) const
{ int index = ui->treeWidget->indexOfTopLevelItem(curItem);
ui->treeWidget->takeTopLevelItem(index); //本函从树视图上去除该节点,但并未内存删除它
//QTreeWidgetItem * QTreeWidget::takeTopLevelItem(int index);
}
delete curItem; //彻底删除节点,删除这颗子树。
}
else if (watched == ui->tableWidget)
{ //QTableWidgetItem * QTableWidget::takeItem(int row, int column);
QTableWidgetItem * item = ui->tableWidget->takeItem(
ui->tableWidget->currentRow(), ui->tableWidget->currentColumn());
//int QTableWidget::currentRow() const;
delete item;
}
return true; //表示事件已经被处理
}
(197)
谢谢