当我们对窗口的显示进行修改的时,有时候需要添加一些操作,这个时候就知道下面操作的重要性了:
//首先给当前窗口安装事件过滤器.
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);