Qt实战案例(41)——利用QWinTaskbarButton和QWinTaskbarProgress类实现任务栏进度条的显示

发布时间:2023-08-22 14:00

目录

    • 一、项目介绍
    • 二、项目基本配置
    • 三、UI界面设置
    • 四、主程序实现
      • 4.1 pro文件
      • 4.2 widget.h头文件
      • 4.3 widget.cpp源文件
    • 五、效果演示

一、项目介绍

任务栏进度条是Windows7就引入的一种UI形式,通常用于显示软件当前正在执行的任务的进度(如编译程序的进度、下载任务的进度)。如下:

\"在这里插入图片描述\"

本文主要介绍利用QWinTaskbarButton和QWinTaskbarProgress类实现任务栏进度条的显示。

二、项目基本配置

新建一个Qt案例,项目名称为“TaskbarTest”,基类选择“QWidget”,点击选中创建UI界面复选框,完成项目创建。

三、UI界面设置

UI界面如下,只有一个按钮PushButton:
\"Qt实战案例(41)——利用QWinTaskbarButton和QWinTaskbarProgress类实现任务栏进度条的显示_第1张图片\"

四、主程序实现

4.1 pro文件

pro文件中需要增加一个库:

QT       += winextras

Qt框架针对Windows提供了一个单独的模块WinExtras。这个模块中提供了一些类库和函数,用于实现Windows上特有的功能,如类型转换、句柄操作、窗口属性设置等。当然也包括了此次我们要说的任务栏进度条,QWinTaskbarButton和QWinTaskbarProgress类。

4.2 widget.h头文件

声明计时器、任务栏按钮和进度指示器:

public:
	QTimer *timer;
    QWinTaskbarButton *windowsTaskbarButton;
    QWinTaskbarProgress *windowsTaskbarProgress;

声明定时器槽函数和按钮点击槽函数:

private slots:
    void onTimeout();
    void onButtonClicked();

4.3 widget.cpp源文件

在构造函数中编写代码如下:

    timer = new QTimer;
    timer->setInterval(10);//设置时间间隔为100ms
    timer->setSingleShot(false);//设置不是单次触发器

    windowsTaskbarButton = new QWinTaskbarButton(this);    //创建显示进度的任务栏按钮
    connect(timer, &QTimer::timeout, this, &Widget::onTimeout);//连接定时器信号和对应的槽函数
    connect(ui->pbn_start, &QPushButton::clicked, this, &Widget::onButtonClicked);//连接按钮点击信号和对应的槽函数

定义计时器对应的槽函数:

void Widget::onTimeout() {
    qDebug()<<windowsTaskbarProgress->value()+1;
    windowsTaskbarProgress->setValue(windowsTaskbarProgress->value() + 1);//设置TaskbarProgress的当前值
    windowsTaskbarProgress->show(); //显示TaskbarProgress
    //当达到最大值时则计时器停止且重置进度指示器
    if(windowsTaskbarProgress->value()==100)
    {
        timer->stop();//计时器停止
        windowsTaskbarProgress->reset();//重置进度指示器

    }
}

定义按钮点击槽函数:

void Widget::onButtonClicked() {
    windowsTaskbarButton->setWindow(windowHandle());    //将任务栏按钮与进度条关联,假设进度条是它自己的窗口
    windowsTaskbarProgress = windowsTaskbarButton->progress();//设置进度指示器
    windowsTaskbarProgress->setRange(0, 100);   //设置最小值和最大值的值
    timer->start(); //定时器启动
}

五、效果演示

完整效果如下:
\"Qt实战案例(41)——利用QWinTaskbarButton和QWinTaskbarProgress类实现任务栏进度条的显示_第2张图片\"

【注意】: 这里有个坑,windowHandle()调用要在窗口显示出来之后才能返回正确的窗口句柄,否则返回的null,导致任务栏进度条无法正常显示。


如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/84404358

ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~

参考链接:https://forum.qt.io/topic/70672/windowhandle-will-return-null

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号