QtWindows任务栏

发布于:2024-05-06 ⋅ 阅读:(17) ⋅ 点赞:(0)

引言

针对Windows系统的任务栏,Qt基于系统的原生接口封装有一些非常见类,如QWinTaskbarButton、QWinTaskbarButton、QWinThumbnailToolBar等,用于利用工具栏提供更多的信息,诸如通过任务栏就能知道当前下载的进度、任务栏右键菜单会记录之前打开的文件等。

任务栏进度

A progress indicator is used to give the user an indication of the progress of an operation and to reassure them that the application is still running.
If minimum and maximum both are set to 0, the indicator shows up as a busy (indeterminate) indicator instead of a percentage of steps. This is useful when it is not possible to determine the number of steps.

例图 描述
在这里插入图片描述 A progress indicator at 50%.
在这里插入图片描述 A paused progress indicator at 50%.
在这里插入图片描述 A stopped progress indicator at 50%.
在这里插入图片描述 An indeterminate progress indicator.

如上所示,QWinTaskbarProgress能够表示不同的状态,如当前进度、暂停、停止等。当然这个依赖于当前的系统版本,不同版本的进度状态表现是不一样的,诸如Windows11就将进度条从背景改为置底,如下图中最右侧的图标:
在这里插入图片描述

示例代码:

void MainWindow::onStarted()
{
    if(!taskbar_button_){
        taskbar_button_ = new QWinTaskbarButton(this);
        taskbar_button_->setOverlayIcon(QIcon(":/image/rocket.png"));
        taskbar_button_->setWindow(windowHandle());

        taskbar_progress_ = taskbar_button_->progress();
        taskbar_progress_->setRange(0, 100);
        taskbar_progress_->show();
    }

    timer_->start();
}
void MainWindow::onTimeout()
{
    if(!taskbar_progress_) {
        return;
    }
    taskbar_progress_->setValue((taskbar_progress_->value() + 15) % 100);
}

如上所示,首先需要构造QWinTaskbarButton,可以通过函数setOverlayIcon为其设置图标,此处设置火箭的图标,可以增加额外的提示和趣味性。再者就是设置其显示在哪个窗体上,需要通过setWindow设置原生窗口的指针。最后就是从QWinTaskbarButton取出QWinTaskbarProgress,通过setValue设置当前进度即可。

需要注意的是,windowHandle()需要在窗体第一次show()之后,才能获得到正确的原生窗口指针,Qt的窗体在构造时并未构造原生窗体,只有在show()之后才会真正去创建,因此一般是在需要使用才会创建QWinTaskbarButton并赋值,也可以在showEvent中,而不是在QMainWindow的构造函数内完成。

右键菜单

在这里插入图片描述

任务栏的右键菜单在IDE中很常用,用来记录之前打开的文件列表,Qt中通过QWinJumpList实现,代码如下:

void MainWindow::onStarted()
{
    if(!taskbar_button_){
        taskbar_button_ = new QWinTaskbarButton(this);
        taskbar_button_->setOverlayIcon(QIcon(":/image/rocket.png"));
        taskbar_button_->setWindow(windowHandle());

        taskbar_progress_ = taskbar_button_->progress();
        taskbar_progress_->setRange(0, 100);
        taskbar_progress_->show();
    }

    timer_->start();
}
void MainWindow::onTimeout()
{
    if(!taskbar_progress_) {
        return;
    }
    taskbar_progress_->setValue((taskbar_progress_->value() + 15) % 100);
}

QWinJumpList 中有已经创建好的分类QWinJumpListCategory ,如tasks、recent,可以添加对应的item或是link,实现一些快捷功能。tasks默认是隐藏的需要打开,添加在recent中的记录会有缓存,如果不希望保留可以在添加前调用clear()。

缩略图工具栏

在这里插入图片描述

当鼠标悬浮在任务栏上会有缩略图弹窗,在其下方是可以额外增加工具条的,如上所示。同样的Qt封装边界类QWinThumbnailToolBar可以轻松完成,构造toolBar及所需要的toolButton,再将按钮添加至工具栏即可,代码如下:

void MainWindow::onStarted()
{
    if(!taskbar_button_){
        taskbar_button_ = new QWinTaskbarButton(this);
        taskbar_button_->setOverlayIcon(QIcon(":/image/rocket.png"));
        taskbar_button_->setWindow(windowHandle());

        taskbar_progress_ = taskbar_button_->progress();
        taskbar_progress_->setRange(0, 100);
        taskbar_progress_->show();
    }

    timer_->start();
}
void MainWindow::onTimeout()
{
    if(!taskbar_progress_) {
        return;
    }
    taskbar_progress_->setValue((taskbar_progress_->value() + 15) % 100);
}

比较特殊的属性dismissOnClick,点击后是否关闭缩略图浮窗,默认为false。

完整代码

代码下载链接