Russian Qt Forum
Ноябрь 23, 2024, 02:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: ProgressBar  (Прочитано 4369 раз)
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-ом работаю,да и программирую недавно, так что не ругайте за глупые вопросы
Записан
alexman
Гость
« Ответ #1 : Февраль 26, 2010, 13:11 »

Лучше копирование и прогресс бар разделить на разные потоки, а то прогресс бар может подвисать! Соединить потоки можно сигналами/слотами! Прогресс бар должен висеть в главной нитке приложения!
Записан
Garfild
Гость
« Ответ #2 : Февраль 26, 2010, 13:47 »

А эт сложно сделать??Если я вообще с потоками не работал еще ((...
Если не затруднит,можно небольшой примерчик
Записан
alexman
Гость
« Ответ #3 : Февраль 26, 2010, 13:57 »

QThread в Qt Assistant. А лучше почитать про многопоточные приложения!
Записан
Garfild
Гость
« Ответ #4 : Февраль 26, 2010, 14:37 »

А если у меня определенное количество таблиц,которые надо скопировать - 11,то тож может подвисать если однопоточное приложение используешь???
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Февраль 26, 2010, 17:42 »

Сильно в код не вдавался, но, вроде, все нормально. Чтобы не подвисал интерфейс и не хочется заморочек, то можно периодически вызывать QCoreApplication::processEvents().
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.244 секунд. Запросов: 23.