Qt QProgressBar 重写前的练习,了解Qt 槽函数的线程机制

我把主要对代码的分析写到注释里面了:

上代码吧:


例子原型,来源于网络:

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QLineEdit>
#include <QProgressBar>
#include <QComboBox>
#include <QPushButton>
#include <QGridLayout>
#include <QDialog>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private
    slots: void startProgress(); // 开始进程
private:
    Ui::MainWindow *ui; // 主窗口
    QLabel * FileNum;
    QLineEdit * FileNumLineEdit;
    QLabel *ProgressType;
    QComboBox * comboBox;
    QProgressBar *ProgressBar;
    QPushButton *startBtn;
    QGridLayout *mainLayout;
    QDialog * dialog; // 用于声明一个对话框,因为布局不能再主窗口之上。
};

#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFont>
#include <QProgressDialog>
#include <QDialog>

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

    FileNum = new QLabel(); // 下面一样,因为要使用布局管理器,所以不要初始化父对象
    FileNum ->setText(tr("文件数目:"));
  //  FileNum->show();
    FileNumLineEdit = new QLineEdit();
   // FileNumLineEdit->show();
    FileNumLineEdit->setText(tr("10000"));

    ProgressType = new QLabel();
   // ProgressType->show();
    ProgressType->setText(tr("显示类型:"));
    comboBox = new QComboBox();
   // comboBox->show();
    comboBox ->addItem(tr("progressBar"));
    comboBox ->addItem(tr("progressDialog"));

    ProgressBar = new QProgressBar();
    //ProgressBar->show();

    startBtn = new QPushButton();
    //startBtn->show();
    startBtn -> setText(tr("开始"));
    dialog = new QDialog(this); // 创造新的对话框对象
    mainLayout = new QGridLayout(dialog);
    //dialog->show();
    mainLayout->addWidget(FileNum, 0, 0);
    mainLayout->addWidget(FileNumLineEdit, 0, 1); // 设置元素在布局管理器之中的位置
    mainLayout->addWidget(ProgressType, 1, 0);
    mainLayout->addWidget(comboBox, 1, 1);
    mainLayout->addWidget(ProgressBar,2, 0, 1, 2);
    mainLayout->addWidget(startBtn, 3, 1);
    mainLayout->setMargin(15);
    mainLayout->setSpacing(10);

    //dialog->setMinimumSize(500, 500);
    dialog->show();
    connect(startBtn,SIGNAL(clicked()),this, SLOT(startProgress())); // 信号与槽的机制,这种机制很是奇妙,是一种独特的设计模式
    //QProgressDialog *progressDlg = new QProgressDialog(dialog); //这个测试了,只要 QProgressDialog 进行生成,就会自动调用
    //show(); 函数来进行展示视图。
}

void MainWindow::startProgress(){
    bool ok;
    int num = FileNumLineEdit->text().toInt(&ok); // 进行取值,这里面 ok 的返回很是独特
    if(!ok){
        return;
    }
    if(comboBox->currentIndex() == 0){
        ProgressBar->setRange(0, num);
        for(int i = 1; i <= num;i++){
            ProgressBar ->setValue(i);
        }
    }
    else if(comboBox->currentIndex() == 1){
        QProgressDialog *progressDlg = new QProgressDialog(dialog);
        //QFont font("ZYSong18030", 12);
        //progressDlg->setFont(font);
        //progressDlg->show(); // 看来这时不要进行show 的设置工作了,有一种机制可以自动调用show()函数
        progressDlg -> setWindowModality(Qt::WindowModal);
        progressDlg -> setMinimumDuration(5);
        progressDlg -> setWindowTitle(tr("please wait"));
        progressDlg -> setLabelText(tr("正在复制......"));
        progressDlg->setCancelButtonText(tr("取消"));
        progressDlg -> setRange(0, num);
        for(int i = 1; i <= num; i++){
            progressDlg->setValue(i);
            if(progressDlg->wasCanceled()){
                return;
            }
        }
    }
} // 并且,通过不断点击PushButton 按键可以看出,每个信号与槽,都是一个独立的线程,并且其中有线程锁,同时想修改同一个对象的时候,只有
// 一个线程修改过,才能使用另外一个线程,来进行访问,这些似乎更好玩,等我们过几天来进行运用多线程机制来进行应用的扩散。

MainWindow::~MainWindow()
{
    delete ui; // 这些是图形界面的标志视图,用来进行显示其中的图像的情况。
}



main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w; // 运行主窗口的类对象
    w.show();

    return a.exec();
}

运行结果:

QProgress 



QProgressDialog:



我是奔跑的Q, 交流邮箱: yaowen_contact#163.com (# 转化为 @ )  注意分析问题要从更高的角度



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值