Название: ProgressBar
Отправлено: Garfild от Февраль 26, 2010, 13:03
Добрый день,уважаемые форумщики!!!! Хочу организовать копирование данных из n-го кол-ва таблиц...И вот хочу чтобы организовать ProgressBar для отображения процесса копирования. Делаю так: C++ (Qt) #ifndef TBL_H #define TBL_H #include <QtGui/QDialog> #include <QSqlQueryModel> #include <QProgressBar> namespace Ui { class tbl; } class tbl : public QDialog { Q_OBJECT public: tbl(QWidget *parent = 0); ~tbl(); QProgressBar *progress; void copySmeta(int rf_IDSmetiCopy,int rf_IDSmetiNew); int sch; protected: void changeEvent(QEvent *e); private: Ui::tbl *m_ui; private slots: void slotCopy(); void slotProgress(); signals: void copyEndTabl(); #endif // TBL_H };
C++ (Qt) #include "tbl.h" #include "ui_tbl.h" #include <QMessageBox> #include <QSqlQuery> #include <QSqlError> tbl::tbl(QWidget *parent) : QDialog(parent), m_ui(new Ui::tbl) { m_ui->setupUi(this); sch=0; progress=new QProgressBar(this); connect(m_ui->pushButton,SIGNAL(clicked()),this,SLOT(slotCopy())); } tbl::~tbl() { delete m_ui; } void tbl::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: m_ui->retranslateUi(this); break; default: break; } } void tbl::slotCopy(){ progress->show(); connect(this,SIGNAL(copyEndTabl()),this,SLOT(slotProgress())); copySmeta(16,17); } void tbl::copySmeta(int rf_IDSmetiCopy,int rf_IDSmetiNew){ QString st=""; QString st1=""; QSqlQuery query; query.exec("INSERT INTO [0_Dohod](rf_IDSmeti,rf_IDSprDohod,Sum) " " SELECT "+st.setNum(rf_IDSmetiNew)+",rf_IDSprDohod,Sum FROM [0_Dohod] " " WHERE rf_IDSmeti="+st1.setNum(rf_IDSmetiCopy)+""); if(query.lastError().isValid()){ QMessageBox::critical(this,tr("Ошибка SQL"),query.lastError().text()); return; } else emit copyEndTabl(); query.clear(); query.exec("INSERT INTO [0_Rashod](rf_IDSmeti,rf_CodeGroupRashod,rf_CodeIDSprRashod,Sum) " " SELECT "+st.setNum(rf_IDSmetiNew)+",rf_CodeGroupRashod,rf_CodeIDSprRashod,Sum FROM [0_Rashod] " " WHERE rf_IDSmeti="+st1.setNum(rf_IDSmetiCopy)+""); if(query.lastError().isValid()){ QMessageBox::critical(this,tr("Ошибка SQL"),query.lastError().text()); return; } else emit copyEndTabl(); query.clear(); query.exec("INSERT INTO [1_SvodZP_osn](rf_IDSmeti,rf_CodeUsl,rf_IDCatPerson,count_positions,FOT_ETS, " " nadb_NeprRab,nadb_vrednost,nadb_RabNaSele,[FOT_night-time], " " FOT_weekend,FOT_otpusk,FOT_PovishKvalif,Itog,FOT_monthly_14, " " FOT_monthly_30,Premirovanie,Napryagennost,PovishKvalif,FOT_itogo, " " Prevish_NormNagruzki,FOT_year,PlanZakaz,SvPlanZakaz) " " SELECT "+st.setNum(rf_IDSmetiNew)+",rf_CodeUsl,rf_IDCatPerson,count_positions,FOT_ETS, " " nadb_NeprRab,nadb_vrednost,nadb_RabNaSele,[FOT_night-time], " " FOT_weekend,FOT_otpusk,FOT_PovishKvalif,Itog,FOT_monthly_14, " " FOT_monthly_30,Premirovanie,Napryagennost,PovishKvalif,FOT_itogo, " " Prevish_NormNagruzki,FOT_year,PlanZakaz,SvPlanZakaz " " FROM [1_SvodZP_osn] " " WHERE rf_IDSmeti="+st1.setNum(rf_IDSmetiCopy)+""); if(query.lastError().isValid()){ QMessageBox::critical(this,tr("Ошибка SQL"),query.lastError().text()); return; } else emit copyEndTabl(); query.clear(); query.exec("INSERT INTO [1_SvodZP_dop](rf_IDSmeti,rf_IDCatDopPerson,rf_IDCatPerson,count_positions,FOT_ETS, " " nadb_NeprRab,nadb_vrednost,nadb_RabNaSele,[FOT_night-time], " " FOT_weekend,FOT_otpusk,FOT_PovishKvalif,Itog,FOT_monthly_14, " " FOT_monthly_30,Premirovanie,Napryagennost,PovishKvalif,FOT_year, " " PlanZakaz,SvPlanZakaz) " " SELECT "+st.setNum(rf_IDSmetiNew)+",rf_IDCatDopPerson,rf_IDCatPerson,count_positions,FOT_ETS, " " nadb_NeprRab,nadb_vrednost,nadb_RabNaSele,[FOT_night-time], " " FOT_weekend,FOT_otpusk,FOT_PovishKvalif,Itog,FOT_monthly_14, " " FOT_monthly_30,Premirovanie,Napryagennost,PovishKvalif,FOT_year, " " PlanZakaz,SvPlanZakaz " " FROM [1_SvodZP_dop] " " WHERE rf_IDSmeti="+st1.setNum(rf_IDSmetiCopy)+""); if(query.lastError().isValid()){ QMessageBox::critical(this,tr("Ошибка SQL"),query.lastError().text()); return; } else emit copyEndTabl(); // и т.д. } void tbl::slotProgress(){ sch=sch+25; progress->setValue(sch); }
Все вроде работает....Но может как-нить лучше все-же по другому сделать??? Просто первый раз с ProgressBar-ом работаю,да и программирую недавно, так что не ругайте за глупые вопросы
Название: Re: ProgressBar
Отправлено: alexman от Февраль 26, 2010, 13:11
Лучше копирование и прогресс бар разделить на разные потоки, а то прогресс бар может подвисать! Соединить потоки можно сигналами/слотами! Прогресс бар должен висеть в главной нитке приложения!
Название: Re: ProgressBar
Отправлено: Garfild от Февраль 26, 2010, 13:47
А эт сложно сделать??Если я вообще с потоками не работал еще ((... Если не затруднит,можно небольшой примерчик
Название: Re: ProgressBar
Отправлено: alexman от Февраль 26, 2010, 13:57
QThread в Qt Assistant. А лучше почитать про многопоточные приложения!
Название: Re: ProgressBar
Отправлено: Garfild от Февраль 26, 2010, 14:37
А если у меня определенное количество таблиц,которые надо скопировать - 11,то тож может подвисать если однопоточное приложение используешь???
Название: Re: ProgressBar
Отправлено: Пантер от Февраль 26, 2010, 17:42
Сильно в код не вдавался, но, вроде, все нормально. Чтобы не подвисал интерфейс и не хочется заморочек, то можно периодически вызывать QCoreApplication::processEvents().
|