IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 用QT写一个类似的安装向导界面 -> 正文阅读

[C++知识库]用QT写一个类似的安装向导界面

功能描述

1、点击同意协议,才能进行下一步。
在这里插入图片描述
2、选择一个安装位置,遍历该路径下的所有文件
在这里插入图片描述
3、遍历结果同步到进度条
在这里插入图片描述
4、提供两种激活方式,序列号激活和账号密码激活
在这里插入图片描述

功能实现

框架

添加Qt设计器界面类的QWizard
大多数的向导页都是线性结构,一页接一页,每页有个id。通常每页都是一个QWizardPage进行管理,如果想用自个写的类进行管理,需要进行类提升。
在这里插入图片描述

功能1:点击同意协议,才能进行下一步。

功能解析:未点击同意协议,下一步按钮不可点击。
解决方案:重写QWizardPage里的isComplete()函数,isComplete()是决定Next或者Finish按钮是否可用的函数。从QWizardPage派生了一个wizardpage1类,需要在ui里头对对应的QWizardPage进行类提升。
ps:如果重写isComplete()函数,当isComplete()的值发生改变时,从别的地方发送信号completeChanged()

//wizardpage1.h
#ifndef WIZARDPAGE1_H
#define WIZARDPAGE1_H
#include <QWizardPage>

class WizardPage1 : public QWizardPage
{
public:
    explicit WizardPage1(QWidget *parent = nullptr);
    virtual bool isComplete() const;
    void SetNextEnable(bool bflag);

private:
    bool bt_nextDisable;
};

#endif // WIZARDPAGE1_H
//wizardpage1.cpp
#include "wizardpage1.h"


WizardPage1::WizardPage1(QWidget *parent)
    :QWizardPage(parent)
{
    bt_nextDisable = true;
}

bool WizardPage1::isComplete() const
{
    return !bt_nextDisable;
}

void WizardPage1::SetNextEnable(bool bflag)
{
    bt_nextDisable = !bflag;
}
//在wizard窗口的构造函数进行连接
	connect(ui->checkBox, SIGNAL(toggled(bool)), this, SLOT(slot_checkbox()));
    connect(ui->checkBox, SIGNAL(toggled(bool)), ui->wizardPage1, SIGNAL(completeChanged()));   //勾选框和wizardpage的completechanged关联

//点击同意按钮后,执行的槽函数
	void Wizard::slot_checkbox()
{
    ui->wizardPage1->SetNextEnable(ui->checkBox->isChecked());
}

功能2:选中指定路径的文件夹,并遍历该文件夹下所有的文件

void Wizard::on_pushButton_clicked()
{
    QString filename = QFileDialog::getExistingDirectory(this,tr("文件对话框"),tr("C:"));
    ui->lineEdit->setText(filename);
    emit pathsend(filename);
}

打开资源管理器,默认为C盘,选中文件夹,并把文件夹名字显示在lineEdit中。

        QDirIterator dir_iterator1(str,
            filters,
            QDir::Files | QDir::NoSymLinks,
            QDirIterator::Subdirectories);
        while(dir_iterator1.hasNext())
        {
            dir_iterator1.next();
            QFileInfo file_info = dir_iterator1.fileInfo();
            QString absolute_file_path = file_info.absoluteFilePath();
            //qDebug()<<absolute_file_path;
            ++flagnow;
            emit Sig_ProgressValue(flagnow);
            emit absolutepath(absolute_file_path);
            msleep(100);
        }

遍历该文件夹下所有文件,模拟安装操作。

功能3:设置进度条

如果要遍历的文件夹下文件很多,需要开辟一个新线程来同步进度条信息,否则遍历文件夹的操作会阻塞主窗口,直到遍历完成主窗口才会响应。
QT新线程通过继承QThread,重写run函数来执行新线程要执行的操作。
QThread::start(); //表示开始执行run函数
QThread::quit(); //表示线程停止

void mythread::run()
{
    //QString str = "E:\mytestcode";
    QString str = path;
        size_t flag = 0;
        size_t flagnow = 0;
        QStringList filters;    //不设置默认所有文件


        QDirIterator dir_iterator(str,
            filters,
            QDir::Files | QDir::NoSymLinks,
            QDirIterator::Subdirectories);

        while(dir_iterator.hasNext())
        {
            dir_iterator.next();
            flag++;
            qDebug()<<flag;
        }
        emit Sig_ProgressMaxValue(flag);
        QDirIterator dir_iterator1(str,
            filters,
            QDir::Files | QDir::NoSymLinks,
            QDirIterator::Subdirectories);
        while(dir_iterator1.hasNext())
        {
            dir_iterator1.next();
            QFileInfo file_info = dir_iterator1.fileInfo();
            QString absolute_file_path = file_info.absoluteFilePath();
            //qDebug()<<absolute_file_path;
            ++flagnow;
            emit Sig_ProgressValue(flagnow);
            emit absolutepath(absolute_file_path);
            msleep(100);
        }
}	

run()函数里,执行文件遍历操作,并发送信号将进度条需要的信息传出。
目前只会用信号与槽对数据进行共享。
进度条设置,最大值不用设置成100,可以设置成任意数,然后发送当前值,QT的进度条会自动帮你算成百分数。

功能4:两种激活方式

通过comboBox提供两种选项,将两个QWidget放在QStackWidget里,不同的选项,对应两个QWidget的显示与隐藏。

  • lineEdit的掩码inputMask,就是符合条件的才会输入!比如全数字啥的。

完整代码

QT写的类似的安装向导界面

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-07 10:38:51  更:2021-09-07 10:39:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:09:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码