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

来源:互联网 发布:ubuntu kylin 14.04 编辑:程序博客网 时间:2024/06/13 21:27

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

上代码吧:


例子原型,来源于网络:

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_OBJECTpublic:    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
原创粉丝点击