【Qt实用技巧】任务栏进度条的实现

631 阅读2分钟

📒博客首页:何名取 的个人主页 - 文章 - 掘金 (juejin.cn)
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
❤️期待一起交流!
🙏作者水平很有限,如果发现错误,求告知,多谢!
🌺有问题可私信交流!!!


WinTaskbarProgress

前言

本节来实现任务栏进度条,主要用于下载文件或编译时对进度的可视化。

动画3.gif

Qt Windows Extras模块介绍

Qt Windows Extras提供了一些类和函数,使开发者能够使用各种特定于Windows的函数。例如,可以将Qt对象转换为Windows对象控制柄,并操作DWM玻璃框架。

此外,开发者可以使用Windows 7引入的功能,如Aero Peek、跳转列表、任务栏按钮上的进度指示器或缩略图工具栏。

Qt Windows Extras模块在Qt6中被移除了,支持Qt Windows Extras模块的最高Qt版本是5.15版本。Qt文档中说明了Qt Windows Extras模块支持Win7,但是在Win10上任务栏进度条也可以使用。

实例

使用Qt Windows Extras模块需要在.pro工程文件中添加如下模块标识:

QT       += winextras

之后可以正常使用QWinTaskbarProgress类和QWinTaskbarButton类进行实现,下面的代码用按钮点击来代替下载开始按钮模拟文件下载。

h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QWinTaskbarProgress>
#include <QWinTaskbarButton>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;

    QTimer* timer;
    QWinTaskbarButton* m_taskBar_button;
    QWinTaskbarProgress* m_taskBar_progress;
};

#endif // MAINWINDOW_H
cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    timer = new QTimer;
    timer->setInterval(1000);
    m_taskBar_button = new QWinTaskbarButton(this);

    // signals and slots
    connect(timer, &QTimer::timeout, this, [=]()
    {
        m_taskBar_progress->setValue(m_taskBar_progress->value() + 10);
        m_taskBar_progress->show();
        if (m_taskBar_progress->value() >=100)
        {
            timer->stop();
            m_taskBar_progress->setValue(0);
        }
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    m_taskBar_button->setWindow(windowHandle());
    m_taskBar_progress = m_taskBar_button->progress();
    m_taskBar_progress->setRange(0, 100);

    timer->start();
}

Qt6版本相较Qt5.15虽然版本更新了,但是移除了很多东西,Qt Windows Extras模块也是其中一个,因此使用Qt6反倒无法直接实现这个小功能了。

这个链接中是Qt6版本中移除模块的具体信息。Qt6中改变的Qt Extras模块