Russian Qt Forum

Qt => Общие вопросы => Тема начата: Garfild от Февраль 26, 2010, 13:03



Название: 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().