Qt在弹窗外点击或点击按钮,弹窗消失

  1. 主窗口头文件
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class ColorWgt;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void showColorWgt(bool checked);
    void hideColorWgt();

private:
    Ui::Widget *ui;
    ColorWgt *m_pColorWgt;
};

#endif // WIDGET_H
  1. 主窗口cpp文件
#include "widget.h"
#include "ui_widget.h"
#include "colorwgt.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    m_pColorWgt = new ColorWgt(this);

    ui->pushButton->setCheckable(true);//设置按钮可以保持点击的状态,就像灯的开和关一样

    connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(showColorWgt(bool)));//点击按钮弹出或隐藏弹窗
    connect(m_pColorWgt, SIGNAL(hideColorWgt()), this, SLOT(hideColorWgt()));//如果鼠标不在按钮上但点击了将按钮状态改为false
}

Widget::~Widget()
{
    delete ui;
}

void Widget::showColorWgt(bool checked)
{
    if(checked)
    {
        m_pColorWgt->show();
    }
    else
    {
        m_pColorWgt->hide();
    }
}

void Widget::hideColorWgt()
{
    //当弹窗对象不为空、且按钮处于点击状态、且光标点击位置不在按钮上时,按钮状态改为false
    if(m_pColorWgt != NULL && ui->pushButton->isChecked() && !ui->pushButton->geometry().contains(this->mapFromGlobal(QCursor::pos())))
    {
        ui->pushButton->setChecked(false);
    }
}

  1. 弹窗头文件
#ifndef COLORWGT_H
#define COLORWGT_H

#include <QWidget>

namespace Ui {
class ColorWgt;
}

class ColorWgt : public QWidget
{
    Q_OBJECT

public:
    explicit ColorWgt(QWidget *parent = 0);
    ~ColorWgt();

protected:
    bool event(QEvent *event);

signals:
    void hideColorWgt();

private:
    Ui::ColorWgt *ui;
};

#endif // COLORWGT_H

  1. 弹窗cpp文件
#include "colorwgt.h"
#include "ui_colorwgt.h"

ColorWgt::ColorWgt(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ColorWgt)
{
    ui->setupUi(this);

    this->setWindowFlags(Qt::Popup);
}

ColorWgt::~ColorWgt()
{
    delete ui;
}

//重写事件,当事件类型为小部件被隐藏时,发送信号告诉主窗口
bool ColorWgt::event(QEvent *event)
{
    if(event->type() == QEvent::HideToParent)
    {
        emit hideColorWgt();
    }
    return QWidget::event(event);
}

参考博文链接点此处

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值