QT失去focus后自动隐藏界面

本文介绍了如何开发一个股票分析软件,并实现声音调节面板的自动隐藏功能。当用户离开界面或失去焦点时,面板会自动隐藏。通过重写`leaveEvent`和`focusOutEvent`函数,结合`QEvent`和`QFocusEvent`,实现了这一功能。此外,还展示了如何在需要时显示面板并设置其位置。
摘要由CSDN通过智能技术生成

自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:

https://www.cnblogs.com/bclshuai/p/11380657.html

1.应用场景

在一些临时显示的界面,比如声音的调节面板,设置好声音后,不需要手动按钮来控制隐藏,而是离开界面,或者失去focus之后自动隐藏窗口。如下图所示。

2.实现方法

重写下面两个虚函数,实现离开界面和失去foucs时自动隐藏的功能

void leaveEvent(QEvent *e);                      //离开QWidget瞬间事件
    void focusOutEvent(QFocusEvent *event);//失去focus时自动隐藏

头文件

#ifndef VOICECTRL_H
#define VOICECTRL_H

#include <QDialog>
#include "ui_voicewin.h"
class VoiceCtrl : public QDialog
{
	Q_OBJECT

public:
	VoiceCtrl();
	~VoiceCtrl();
	Ui::VoiceCtrl ui;
protected:
	void enterEvent(QEvent *e);                      //进入QWidget瞬间事件
	void leaveEvent(QEvent *e);                      //离开QWidget瞬间事件
	void focusOutEvent(QFocusEvent *event);
private:
};

#endif // VOICECTRL_H

源文件

#include "VoiceCtrl.h"

VoiceCtrl::VoiceCtrl()
{
	ui.setupUi(this);
	setWindowModality(Qt::NonModal);
	setWindowFlags(Qt::FramelessWindowHint| Qt::WindowStaysOnTopHint);
	//setAttribute(Qt::WA_TranslucentBackground, true);//背景设置透明
	this->resize(36, 112);
	connect(ui.checkBoxVolume, &QCheckBox::clicked, this, [=]() {
	if (ui.checkBoxVolume->isChecked())
	{
		ui.horizontalSliderSimilarity->setValue(0);
	} 
	else
	{
		ui.horizontalSliderSimilarity->setValue(50);
	}
	});
	connect(ui.horizontalSliderSimilarity, &QSlider::valueChanged, this, [=]() {
		if (ui.horizontalSliderSimilarity->value()==0)
		{
			ui.checkBoxVolume->setChecked(true);
		}
		else
		{
			ui.checkBoxVolume->setChecked(false);
		}
	});
	
}

VoiceCtrl::~VoiceCtrl()
{
	
}
void VoiceCtrl::enterEvent(QEvent *e)
{
	show();
}

void VoiceCtrl::leaveEvent(QEvent *e)//离开隐藏closebutton
{
	hide();
}

void VoiceCtrl::focusOutEvent(QFocusEvent * event)//失去焦点后自动隐藏
{
     //如果是点击界面上的控件,声音控制界面也会失去focus,所以点击界面上的控件时,这里返回不隐藏
	if (ui.checkBoxVolume->hasFocus()||ui.horizontalSliderSimilarity->hasFocus())
	{
		return;
	}
	hide();
}

在需要使用声音调节面板的地方,创建VoiceCtrl对象,通过点击按钮,来显示声音控制面板到按钮的上方,离开控制面板或失去focus之后自动隐藏。

//显示声音调节界面
    {
        QPoint point = this->mapToGlobal(ui.PlayWndToolbar_RightWnd->pos());
        m_volumeCtrl.move(point.x()-4, point.y() - 110);
        m_volumeCtrl.show(); 

//最关键的一步,一定要将界面对象设置为该属性,否则无法实现点击其他地方,声音界面无focus时自动隐藏。
        m_volumeCtrl.setFocus(Qt::ActiveWindowFocusReason); 
    }

ActiveWindowFocusReason

public static final Qt.FocusReason ActiveWindowFocusReason

The window system made this window either active or inactive.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bclshuai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值