Qt QProgressBar 重写前的练习,了解Qt 槽函数的线程机制
2016-03-06 00:50
691 查看
我把主要对代码的分析写到注释里面了:
上代码吧:
例子原型,来源于网络:
MainWindow.h
MainWindow.cpp
main.cpp
运行结果:
QProgress
QProgressDialog:
我是奔跑的Q, 交流邮箱: yaowen_contact#163.com (# 转化为 @ ) 注意分析问题要从更高的角度
上代码吧:
例子原型,来源于网络:
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 (# 转化为 @ ) 注意分析问题要从更高的角度
相关文章推荐
- QT记事本的读写函数
- qtimer类
- QT环境搭建
- 最近要开一个Qt 的专栏,大家关注一下吧
- QT5 串口操作
- QT OpenCV2.4.11 .pro文件内容
- Qt串行化的输入和输出
- 使用qt写的进制转换器
- QT学习之QString的arg方法
- QT学习之经典控件源码(如此强大)
- Qt stylesheet 源码学习
- 一起看代码来玩玩QT之18 QSqlDatabase (three 将database 通过 QTableView显示到界面上,并且增删改查
- GDKOI2016 Day2 T2 QT与泰剧
- 基于QT+OpenCV图像处理之滤波1
- QT信号和槽用于对象之间的通信
- 认识Qter
- QTableView使用笔记
- Ubuntu下Qt嵌入式开发平台的搭建
- “qt没有被正确的安装,请运行make install”解决方法
- 【GDKOI2016】QT与泰剧Code&Details