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之无边框自定义最小化、关闭按钮并实现窗口移动
- 【Qt】自定义标题栏并实现最小化/最大化/关闭窗口功能
- Qt自定义窗口(有最大最小化窗口,关闭窗口)
- MFC在鼠标自定义的一定的范围内实现拖动窗口移动、错误:不支持尝试执行的操作、实现进度条颜色的渐变或者背景和前景色的改变
- Qt之自定义界面添加最小化、关闭按钮、添加背景
- 自定义QT窗口部件外观之QStyle
- Qt中如何使窗口隐藏/最小化到托盘
- Qt自定义界面类并提升(提升的窗口部件),把OpenGL绘制的图形显示在QT的ui界面上
- Qt通过句柄操作外部窗口
- Qt之程序最小化托盘显示及操作
- Qt通过句柄操作外部窗口
- QT窗口去掉最大化最小化关闭按钮
- QT自定义窗口
- Qt自定义窗口部件
- Qt入门(19)——自定义窗口部件
- Adobe AIR迷你教程 -- 使用自定义窗口以及对窗口的移动,缩放,关闭操作
- Qt之程序最小化托盘显示及操作
- Qt实用技巧:自定义窗口标题栏
- QT 窗口样式,最小化 无边框 不规则窗体
- Qt自定义外观--自定义标题栏的窗口