功能描述
1、点击同意协议,才能进行下一步。 2、选择一个安装位置,遍历该路径下的所有文件 3、遍历结果同步到进度条 4、提供两种激活方式,序列号激活和账号密码激活
功能实现
框架
添加Qt设计器界面类的QWizard 大多数的向导页都是线性结构,一页接一页,每页有个id。通常每页都是一个QWizardPage进行管理,如果想用自个写的类进行管理,需要进行类提升。
功能1:点击同意协议,才能进行下一步。
功能解析:未点击同意协议,下一步按钮不可点击。 解决方案:重写QWizardPage里的isComplete()函数,isComplete()是决定Next或者Finish按钮是否可用的函数。从QWizardPage派生了一个wizardpage1类,需要在ui里头对对应的QWizardPage进行类提升。 ps:如果重写isComplete()函数,当isComplete()的值发生改变时,从别的地方发送信号completeChanged()。
#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
#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;
}
connect(ui->checkBox, SIGNAL(toggled(bool)), this, SLOT(slot_checkbox()));
connect(ui->checkBox, SIGNAL(toggled(bool)), ui->wizardPage1, SIGNAL(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();
++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 = 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();
++flagnow;
emit Sig_ProgressValue(flagnow);
emit absolutepath(absolute_file_path);
msleep(100);
}
}
在run()函数里,执行文件遍历操作,并发送信号将进度条需要的信息传出。 目前只会用信号与槽对数据进行共享。 进度条设置,最大值不用设置成100,可以设置成任意数,然后发送当前值,QT的进度条会自动帮你算成百分数。
功能4:两种激活方式
通过comboBox提供两种选项,将两个QWidget放在QStackWidget里,不同的选项,对应两个QWidget的显示与隐藏。
- lineEdit的掩码inputMask,就是符合条件的才会输入!比如全数字啥的。
完整代码
QT写的类似的安装向导界面
|