QT制作的软件全屏显示后最小化,点击任务栏图标打开时不是全屏

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

结尾

希望能够帮助到您哦~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1594231563

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值