Qml控制多个窗口任务栏图标显示及更改图标

环境: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种处理选择:

  1. 每次加载前先清除loader,在加载  //不建议这么做
  2. 在每次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

于此,可以自由控制窗口显示图标及更改图标。

但还有一个缺陷是,自定义的窗口标题栏和任务栏的标题栏的图标是不一致的,而一样又会导致任务栏的图标和标题栏的图标不一致,所以设置窗口图标是治标不治本,只是任务栏图标默认采用窗口图标而已。

如果有这样的需要,可以专门去设计TaskBarButton的样式了。TaskBarButton提供了一个overlay,只需要提供的图片能覆盖住任务栏的图片就能完美掩饰了。

猜你喜欢

转载自blog.csdn.net/qq_40032304/article/details/100802000