Qt|编辑框界面操作--失去焦点隐藏(升级版)

805 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

今天这篇文章继续为大家更新编辑框操作,也是上一篇文章的升级版,在子窗口中处理这样的功能。

实现效果完全一致,首先来看一下展示效果~

lineEdit焦点升级版.gif

看到展示效果,大家会发现,页面上的控件一样,但是并不是在主窗口创建的,在这里我是将编辑框控件嵌入到了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++开发程序猿~