环境:win10;Qt5.11
网上搜索了很久,也没发现这方面的详细教程,花了我好久时间,于是记录下过程。
一、设置任务栏图标是否显示
设置flags: Qt.FramelessWindowHint能去掉窗口标题栏,但不显示任务栏图标
设置flags: Qt.FramelessWindowHint | Qt.Window能显示任务栏图标
然而,对于子窗口不同,子窗口视根窗口为parent,自然不能显示任务栏图标。
这时需要用到Loader组件去动态加载子窗口才能显示任务栏图标,但情况不同。
当子窗口设置为flags: Qt.FramelessWindowHint | Qt.Window,loader加载后并不能显示任务栏图标。
经过尝试发现子窗口visible:true时能显示,由于编译器调试缓存问题,开始误以为是loader的visible属性影响了窗口的visible属性,试了很多遍才搞清楚其实是窗口类的visible属性决定是否显示任务栏图标,即使你item.show出来也不会影响这个机制。
于是有2种处理选择:
- 每次加载前先清除loader,在加载 //不建议这么做
- 在每次hide()|close()后主动清除loader资源 //必须这么做,因为很多时候close仅仅只是相当于hide(),而没有delete对象,而对象是保存在loader中
这里说一下第二种,最简单处理是设置子窗口的onClosing槽函数。
代码:
onClosing: {
hide()//不可视窗口退出时不会退出应用
loader.source = ""//释放资源
console.log("win on closeing.")
}
二、更改任务栏图标
由于Window没有icon设置属性,只能借助C++的QWindow|QQuickWindow类实现。
直接上代码:
*.h文件
#ifndef FUNCC_H
#define FUNCC_H
#include <QObject>
#include<QQuickWindow>
class FuncC:public QObject
{
Q_OBJECT
//注册属性
Q_PROPERTY(QQuickWindow* win READ win WRITE setWin NOTIFY winChanged)
public:
FuncC();
QQuickWindow*win()const;
public Q_SLOTS:
void setWin(QQuickWindow*arg);//对m_win赋值自动调用此槽函数
Q_SIGNALS:
void winChanged();
private:
QQuickWindow*m_win;//qml窗口载体
};
#endif // FUNCC_H
*.cpp
#include "funcc.h"
#include<QDebug>
FuncC::FuncC():m_win(Q_NULLPTR)
{
}
QQuickWindow *FuncC::win() const
{
return m_win;
}
void FuncC::setWin(QQuickWindow *arg)
{
qDebug()<<"m_win is viaed";
m_win=arg;
if(!m_win){
qDebug()<<"m_win is null";
return;
}
m_win->setTitle("title");//设置标题
m_win->setIcon(QIcon(":/images/myIcon.png"));//设置图标
emit winChanged();//发送信号
}
这里有一个细节,m_win->setIcon(QIcon(":/图片.png"))
':/'是*.cpp和*.h文本调用资源文件的方式,'qrc:/'是*.qml文本调用资源文件方式
毕竟就因为这个细节耽误了我2天时间,害得我疯狂百度屁用没有!!!可能就是太简单,所以没有人发这方面的文章吧!
最后,等每次loader加载完组件后,立即调用注册的c++类完成更改图标:
funcC.win=loader.item
于此,可以自由控制窗口显示图标及更改图标。