1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > QT制作的软件全屏显示后最小化 点击任务栏图标打开时不是全屏

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

时间:2018-08-02 12:07:11

相关推荐

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;的,后面发现这样子会把其他信号与槽,定时器这些事件全部过滤了,所以大家需要注意这一点。

参考资料

/archives/2052

结尾

希望能够帮助到您哦~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。