QT制作的软件全屏显示后最小化,点击任务栏图标打开时不是全屏
前言
用QT做了一个小软件,把它自带的窗口栏给屏蔽了自己搞了关闭和最小化的按钮,且软件打开是全屏显示的。如今遇到的问题是,打开软件全屏显示后,我要干其他事情就点最小化窗口,后面通过任务栏的图标点开时,软件就不是全屏了,而是软件WindowNoState
时候的尺寸。
找出原因
直接监听窗口状态变化的事件,看看最小化后到点击任务栏图标打开发生了什么事情。
在MainWindow
中重写eventFilter()
事件过滤函数
mainwindow.h中加入
protected:
bool eventFilter(QObject* obj, QEvent* event); /* 事件过滤 */
mainwindow.cpp中实现
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
Q_UNUSED(obj);
if (event->type() == QEvent::WindowStateChange)
{
qDebug()<< this->windowState(); //打印窗口状态
}
return QObject::eventFilter(obj, event);
}
后面打印出来的结果是这样的
QFlags<Qt::WindowState>(WindowNoState)
QFlags<Qt::WindowState>(WindowFullScreen)
QFlags<Qt::WindowState>(WindowNoState)
/* 点击最小化 */
QFlags<Qt::WindowState>(WindowMinimized)
QFlags<Qt::WindowState>(WindowMinimized)
/* 通过任务栏图标打开软件 */
QFlags<Qt::WindowState>(WindowNoState)
我们可以看到点任务栏打开后窗口的状态变为了WindowNoState
,所以我们应该在这个时候再次执行让窗口全屏显示的代码(this->showFullScreen();
)
解决方法
在mainwindow.h
中添加两个变量
private:
Qt::WindowState m_eCurrentWindowState; /* 当前窗口状态 */
Qt::WindowState m_eOldWindowState; /* 之前窗口状态 */
在mainwindow.cpp
改变了窗口状态的地方给这两个函数赋值
/* 初始化为无状态 */
void MainWindow::init_UI()
{
...
m_eCurrentWindowState = Qt::WindowNoState;
m_eOldWindowState = Qt::WindowNoState;
}
/* 全屏显示时 */
void MainWindow::login_success(QString name, QString code)
{
...
this->showFullScreen();
m_eCurrentWindowState = Qt::WindowFullScreen; // 修改当前窗口状态为全屏
}
/* 最小化时 */
void MainWindow::on_btn_minimize_clicked()
{
this->setWindowState(Qt::WindowMinimized);
m_eCurrentWindowState = Qt::WindowMinimized; // 修改当前状态为最小化
m_eOldWindowState = Qt::WindowFullScreen; // 修改之前状态为全屏
}
在mainwindow.cpp
刚才的事件过滤函数中实现
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
Q_UNUSED(obj);
/* 避免最小化后再打开不是全屏显示 */
if (event->type() == QEvent::WindowStateChange)
{
if (m_eCurrentWindowState == Qt::WindowMinimized && m_eOldWindowState == Qt::WindowFullScreen)
{
this->showFullScreen();
m_eOldWindowState = Qt::WindowMinimized;
m_eCurrentWindowState = Qt::WindowFullScreen;
}
}
return QObject::eventFilter(obj, event);
}
ok,这样就可以最小化后打开还是全屏了。如果只有最小化和全屏两个状态的话只需要在最小化时修改那两个参数的状态就行了,如果过是最小化、全屏和最大化多个状态的话就要再优化一下代码了。
注意
上述代码最后使用了
return QObject::eventFilter(obj, event);
的意思是再进行一次QT自带的过滤流程。
一开始我是直接return true;
的,后面发现这样子会把其他信号与槽,定时器这些事件全部过滤了,所以大家需要注意这一点。
参考资料
http://www.lgwimonday.cn/archives/2052
结尾
希望能够帮助到您哦~