您的位置:首页 > 编程语言 > Qt开发

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

2016-03-06 00:50 691 查看
我把主要对代码的分析写到注释里面了:

上代码吧:

例子原型,来源于网络:

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 (# 转化为 @ ) 注意分析问题要从更高的角度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: