您的位置:首页 > 编程语言 > Qt开发

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

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

//首先给当前窗口安装事件过滤器.
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Qt