持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情。
今天这篇文章继续为大家更新编辑框操作,也是上一篇文章的升级版,在子窗口中处理这样的功能。
实现效果完全一致,首先来看一下展示效果~
看到展示效果,大家会发现,页面上的控件一样,但是并不是在主窗口创建的,在这里我是将编辑框控件嵌入到了QScrollArea中。
在实现编辑框这个功能时,我发现了这样一个问题:当编辑框在QScrollArea中时,鼠标点击空白处时,会直接失去焦点!与主窗口中创建编辑框的状态是不一致的!!
刚开始我也觉得很懵,同样是控件怎么放置的位置不同,导致效果不同呢?我也曾网上搜索,但未曾查询到任何答案,只能硬着头皮搞下去啦!
编辑框控件在主窗口创建时,点击保存按钮后,控件消息响应顺序:保存按钮响应 --> 编辑框失去焦点消息
当编辑框控件属于子控件时,点击保存按钮,控件消息响应顺序:编辑框失去焦点 (不响应保存按钮!)
为什么不响应保存按钮响应呢?
是因为在响应失去焦点消息时,对保存按钮进行隐藏,所以就无法响应保存按钮消息了。
那要如何才能既响应编辑框失去焦点消息,又同时响应保存按钮消息呢?
单纯的靠按钮的QPushButton::clicked消息是不可行的了,因为先进行编辑框失去焦点消息,此时控件已经被隐藏,隐藏后的控件是无法响应消息的。
这里,就体现了QWidget::eventFilter过滤器消息的重要性了,无论是否隐藏,只要对控件进行监视,就会接收到消息!是不是很酷~
bool QWidget::eventFilter(QObject * watched, QEvent * event)
{
if (watched == m_btnSave)
{
if (event->type() ==QEvent::MouseButtonPress)
{
qDebug() << QStringLiteral("<eventFilter>点击了保存~");
QString qTitle = m_editTitle->text();
m_labTitle->setText(qTitle); //标题文本设置
m_labTitle->show();
m_editTitle->clear();
m_editTitle->hide();
m_btnSave->hide();
}
}
return QWidget::eventFilter(watched, event);
}
该函数的好处就是:只要对控件进行监视,就可以捕捉到消息,由此实现了,在控件中嵌入编辑框照样可以实现之前的效果了~
我是中国好公民st,一名C++开发程序猿~