Qt : 窗口最小化时自定义操作.

当我们对窗口的显示进行修改的时,有时候需要添加一些操作,这个时候就知道下面操作的重要性了:

//首先给当前窗口安装事件过滤器.
this->installEventFilter(this);

以下实现了通过事件过滤器把窗口最小化时的事件给优先处理了.用户可以自定义一些自己的操作.

bool c::eventFilter(QObject *o, QEvent *e)
{
    if (o == this)
    {
        //窗口状态被改变的事件.
        if(e->type() == QEvent::WindowStateChange)
        {
            if (this->windowState() == Qt::WindowMinimized)
                qDebug() << "WindowMinimized";
            else
                qDebug() << "others";
            return true;
        }
    return QObject::eventFilter(o,e);
}
This enum type is used to specify the current state of a top-level window.

Constant    Value   Description
Qt::WindowNoState   0x00000000  The window has no state set (in normal state).//没有状态,也就是正常状态.
Qt::WindowMinimized 0x00000001  The window is minimized (i.e. iconified).//最小化状态.
Qt::WindowMaximized 0x00000002  The window is maximized with a frame around it.//最大化状态.
Qt::WindowFullScreen    0x00000004  The window fills the entire screen without any frame around it.//全屏状态
Qt::WindowActive    0x00000008  The window is the active window, i.e. it has keyboard focus.//活跃的状态.

上面的方法虽然可以实现小部分的最小化的操作.但是还是有问题的.也就是有错误的.
还记得我们重写鼠标操作的时候吗?

void c::mouseMoveEvent(QMouseEvent *event)
{
    //我们用&按位与来判断移动时按下的键是否包含左键.
    if (event->buttons() & Qt::LeftButton)
        qDebug() << "left move";
    else
        qDebug() << "no left";
}

而窗口的显示状态不会是单一的把.我们多试验几次可以发现:当你在窗口最大化的时候,去最小化窗口,这个时候的窗口其实有两个状态,最大化和最小化.

bool c::eventFilter(QObject *o, QEvent *e)
{
    if (o == this)
    {
        //窗口状态被改变的事件.
        if (e->type() == QEvent::WindowStateChange)
        {
            qDebug() << this->windowState();
            return true;
        }
    }
    return QObject::eventFilter(o,e);
}

我先把窗口最大化,注意:不是全屏.然后在最小化.最后点击任务栏的程序图标,最后再回到正常状态.打印如下:

QFlags(0x2)
QFlags(0x1|0x2)
QFlags(0x2)
QFlags()

所以最后的方式应该把 == 修改为 &,虽然问题很小,但是一不留神,就会发生很奇怪的问题.

bool c::eventFilter(QObject *o, QEvent *e)
{
    if (o == this)
    {
        //窗口状态被改变的事件.
        if (e->type() & QEvent::WindowStateChange)
        {
            if (this->windowState() == Qt::WindowMinimized)
                qDebug() << "WindowMinimized";
            else
                qDebug() << "others";
            return true;
        }
    return QObject::eventFilter(o, e);
}

我们可以通过使用&按位与来判断是否包含一个元素.使用|来添加一个元素也可以通过&~来剔除一个元素.比如:

//第一条语句用来把当前窗口的关闭按钮给禁止了.第二条语句把当前窗口的属性中添加了关闭按钮,也就是激活了关闭按钮.
this->setWindowFlags(this->windowFlags() &~ Qt::WindowCloseButtonHint);
this->setWindowFlags(this->windowFlags() | Qt::WindowCloseButtonHint);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值