Qt5 linux上窗口调用showMinisized后点击任务栏还原显示异常解决

因为软件界面是自定义的无边框窗口,所以也就没有系统的任务工具栏也就不能使用系统工具栏自带的最小化/最大化/全屏 工具按钮,所以需要自己写,直接调用原生的QWidget的showMinisized,showMaxsized,showFullScreen等方法。看似很简单在windows上也正常运行,但是在linux上就出了问题,点击最小化后,点击任务栏的还原不管原来窗口是最大化还是全屏还原回来的窗口依旧不是最大化或者全屏,自己写了一个测试程序发现确实如此,但是在windows上或者再linux上使用qt4确没有这种问题。

可以看到最大化或者全屏之后调用showMinisized最小化然后点击任务栏的图标还原不为原有的状态,但是同样的工程在windows上用qt5运行却可以正确还原,在linux上qt4运行的程序也没有这个问题。后来我在网上查了一下,窗口最大或者最小或者全屏时候窗口状态发生改变也就是windowState会发生改变。

这是官方文档的介绍当发生改变时触发事件windowStateChangeEvent,然后就在windows上打印看了一下这个windowstate改变的过程以正常大小-最大化-最小化-点击任务栏还原为例:

bool MainWindow::event(QEvent *event)
{
    if(event->type() == QEvent::WindowStateChange)
    {
        QWindowStateChangeEvent *wsce = static_cast<QWindowStateChangeEvent*>(event);
        qDebug()<<wsce->oldState()<<"=>"<<windowState();
    }
    return QMainWindow::event(event);
}

打印结果如下:

正常大小->最大化->最小化->点击任务栏还原对应windowState的改变 WindowNoState->WindowMaximizied->WindowMaximinized|WindowMaximizied->WindowMaximized。

简单来说最大化到最小化是Maximized到Minimized|Maximized,然后点击任务栏还原是Minimzied到Maximized,然后再看一下linux上的情况:

同样是最大化然后最小化最后还原打印和windows上不一样,最大化到最小化windowStateChangeEvent触发了三次

QFlags<Qt::WindowState>(WindowMaximized) => QFlags<Qt::WindowState>(WindowMinimized|WindowMaximized)
QFlags<Qt::WindowState>(WindowMinimized) => QFlags<Qt::WindowState>(WindowNoState)
QFlags<Qt::WindowState>(WindowNoState) => QFlags<Qt::WindowState>(WindowMinimized)

最小化还原

QFlags<Qt::WindowState>(WindowMinimized) => QFlags<Qt::WindowState>(WindowNoState)

也就是说最小化后点击任务栏还原后windowState是NoState,并不是Maximized,,全屏最小化还原同理,所以linux 上最小化点击任务栏无法还原为最大/全屏的原因,我一开始打算是改写事件或者采用过滤器最后都发现有问题,后来干脆就用变量来记录最小化时窗体此时windowState还原时进行设置

bool MainWindow::event(QEvent *event)
{
    if (event->type() == QEvent::WindowStateChange) {
        if (m_WindowState == Qt::WindowMinimized &&
            this->windowState() != Qt::WindowFullScreen) {
            if(m_OldWindowState == Qt::WindowMaximized)
            {
                showMaximized();
            }
            if(m_OldWindowState == Qt::WindowFullScreen)
            {
                showFullScreen();
            }
        }
        m_WindowState = this->windowState();
    }
    return QMainWindow::event(event);
}

其中oldWindowState表示最小化时原来的状态在最小化时给他赋值,再调用showMinimized

    m_OldWindowState = this->windowState();
    showMinimized();

可以看到已经正常了

无论是我最大化或是全屏状态下最小化然后点击任务栏进行还原后窗体状态都是原来的状态,至此问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值