zoukankan      html  css  js  c++  java
  • QT失去focus后自动隐藏界面

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

    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);//失去focus时自动隐藏
    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();
    }

    3.创建对象并使用

    在需要使用声音调节面板的地方,创建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.


    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html
  • 相关阅读:
    ListView具有多种item布局——实现微信对话列
    CSDN 2013年度博客之星评选——分享几张厦门杭州的美图
    不做旁观者,给博主最有力的支持——博客之星评选,期待您的支持,谢谢路过的朋友投上您宝贵的一票
    Android应用中使用及实现系统“分享”接口
    android手势创建及识别
    JSON数据源的多值参数实现
    葡萄城报表本地设计器
    如何设计带查询条件的报表
    巧用SQL语句补足不完全数据报表
    表格数据分组报表
  • 原文地址:https://www.cnblogs.com/bclshuai/p/14928429.html
Copyright © 2011-2022 走看看