0

    Qt linux下最小化后,点击任务栏按钮无法恢复之前大小的解决办法

    2023.07.20 | admin | 150次围观

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

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

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

    bool MainWindow::event(QEvent *event)

    {

    if(event->type() == QEvent::WindowStateChange)

    {

    QWindowStateChangeEvent *wsce = static_cast(event);

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

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

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

    QFlags(WindowMaximized) => QFlags(WindowMinimized|WindowMaximized)

    QFlags(WindowMinimized) => QFlags(WindowNoState)

    QFlags(WindowNoState) => QFlags(WindowMinimized)

    最小化还原

    QFlags(WindowMinimized) => QFlags(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();

    可以看到已经正常了

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

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论