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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: форма диалога рисуется с задержкой  (Прочитано 5106 раз)
boriss
Гость
« : Октябрь 27, 2011, 10:06 »

Добрый день!!
А не поможете вот с таким вопросом ... при вызове формы QDialog, форма рисуется с задержкой в несколько  секунд, прям заметно на экране. Что это может быть?
Записан
Bepec
Гость
« Ответ #1 : Октябрь 27, 2011, 10:11 »

Код в студию. описание работы краткое в студию. И чего ты хочешь добиться от программы в студию.

А там и подтянутся тролли и прочая формуная живность.

PS может тормозить изза:
- комп слабый
- просто тормозной
- что то ты неправильно делаешь*
- что то его тормозит
- мб он вообще не тормозит и тебе кажется? Веселый
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Октябрь 27, 2011, 10:21 »

Цитировать
... в студию ... в студию ... в студию.
Прям Поле Чудес... )
Записан

Qt 5.11/4.8.7 (X11/Win)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Октябрь 27, 2011, 10:34 »

наверное в конструкторе диалога разные страшные действия совершаются
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
boriss
Гость
« Ответ #4 : Октябрь 27, 2011, 10:51 »

приложение работает с БД. На форме 3 вьюхи с QsqlQueryModel. И вот когда вьюхи пустые все нормально работает, а когда с данными то немного с задержкой диалог открывается. Возможно это действительно нормально, но как-то непривычно
наверное в конструкторе диалога разные страшные действия совершаются
Обычное сообщение тоже с небольшой задержкой отображается, получается от диалога от моего это не зависит
Записан
boriss
Гость
« Ответ #5 : Октябрь 27, 2011, 12:09 »

такое ощущение что сначала рисуется пустой диалог, безо всяких виджетов, а потом уже с виджетами все как-надо
Записан
Bepec
Гость
« Ответ #6 : Октябрь 27, 2011, 12:12 »

Проблема: задержка диалога

Я так представляю, у Вас в конструкторе происходит наполнение моделей данными из SQL.

Решение: конструктор очистить от лишнего, загрузку данных перенести в отдельную функцию (в идеале поток), поставить пользователю индикатор загрузки данных из баз/базы.

Проблема: слишком частое обновление баз, или же нечастое(раз в секунду) полное их обновление.

И мысль еще - вы обновление делаете насколько часто? Обновление раз в 20 мс тормозит программу не по детски, если производится полное обновление.

Решение: beginResetModel()/endResetModel() - обновление после "полного получения данных", а не пирамидально (пирамидально - это добавление 1 строки и автоматическое обновление предыдущих).

И код, код желательно. Мы ему плохо не сделаем, я его даже с ложечки покормлю.


Записан
boriss
Гость
« Ответ #7 : Октябрь 27, 2011, 13:01 »

Код
C++ (Qt)
#include <QMessageBox>
#include <QSqlError>
#include <QSqlQuery>
 
#include "sprmu.h"
#include "ui_sprmu.h"
 
sprMU::sprMU(QWidget *parent) :
   QDialog(parent),
   ui(new Ui::sprMU)
{
   ui->setupUi(this);
   ui->splitter_2 -> setStretchFactor(0,0);
   ui->splitter_2 -> setStretchFactor(1,1);
   ui->splitter_2 -> setStretchFactor(2,2);
   createButtons();
   //createActions();
 
   // ------- Отображаем Группы МУ
   GroupMUModel = new QSqlQueryModel(this);
   GroupMUModel->setQuery("SELECT MUGroupCode, MUGroupName , MUGroupId "
                          "FROM sprMUGroup "
                          "ORDER BY 1");
   if(GroupMUModel -> lastError().isValid()){
     QMessageBox::critical(this,tr("Ошибка SQL"),GroupMUModel -> lastError().text());
     return;
   }
   ui->GroupMUView -> setModel(GroupMUModel);
 
   // ------- Отображаем Подгруппы МУ
   UnGroupMUModel = new QSqlQueryModel(this);
   UnGroupMUModel -> setQuery("SELECT * "
                              "FROM sprMUUnGroup ");
   if(UnGroupMUModel -> lastError().isValid()){
       QMessageBox::critical(this,tr("Ошибка SQL"),UnGroupMUModel -> lastError().text());
       return;
   }
   ui->UnGroupMUView -> setModel(UnGroupMUModel);
 
   // ------- Отображаем мед. услуги
   MUModel = new QSqlQueryModel(this);
   MUModel -> setQuery("SELECT * FROM sprMU ");
   if(MUModel -> lastError().isValid()){
       QMessageBox::critical(this,tr("Ошибка SQL"),MUModel -> lastError().text());
       return;
   }
   ui->MUView -> setModel(MUModel);
 
}
 
sprMU::~sprMU()
{
   delete ui;
}
 
void sprMU::changeEvent(QEvent *e)
{
   QDialog::changeEvent(e);
   switch (e->type()) {
   case QEvent::LanguageChange:
       ui->retranslateUi(this);
       break;
   default:
       break;
   }
}
 
void sprMU::createButtons(){
   ui->GroupRefrButt -> setStyleSheet("QPushButton {border: none;padding: 4px;} QPushButton:hover {border: 2px outset #8f8f91;border-radius: 4px;} QPushButton:pressed {border: 2px inset #8f8f91;border-radius: 4px;}");
   ui->GroupAddButt -> setStyleSheet("QPushButton {border: none;padding: 4px;} QPushButton:hover {border: 2px outset #8f8f91;border-radius: 4px;} QPushButton:pressed {border: 2px inset #8f8f91;border-radius: 4px;}");
   ui->GroupEditButt -> setStyleSheet("QPushButton {border: none;padding: 4px;} QPushButton:hover {border: 2px outset #8f8f91;border-radius: 4px;} QPushButton:pressed {border: 2px inset #8f8f91;border-radius: 4px;}");
   ui->GroupDelButt -> setStyleSheet("QPushButton {border: none;padding: 4px;} QPushButton:hover {border: 2px outset #8f8f91;border-radius: 4px;} QPushButton:pressed {border: 2px inset #8f8f91;border-radius: 4px;}");
   connect(ui->GroupAddButt,SIGNAL(clicked()),this,SLOT(slotAddGroupMU()));
 
 
}
 
void sprMU::slotAddGroupMU(){
   QMessageBox::information(this,"","");
}
 

вот часть кода. Сдесь при нажатии кнопки на основной форме просто выдается сообщение ... Вот оно выдается с небольшой задержкой. Если в основном компьютере не заполнять модели данными, то сообщение выводится значительно быстрее
Записан
Bepec
Гость
« Ответ #8 : Октябрь 27, 2011, 13:04 »

Код:
#include <QMessageBox>
#include <QSqlError>
#include <QSqlQuery>

#include "sprmu.h"
#include "ui_sprmu.h"

sprMU::sprMU(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::sprMU)
{
    ui->setupUi(this);
    ui->splitter_2 -> setStretchFactor(0,0);
    ui->splitter_2 -> setStretchFactor(1,1);
    ui->splitter_2 -> setStretchFactor(2,2);
    createButtons();
    //createActions();

// убиваем эти строки, выделенные красным (выносим в отдельную функцию)


    // ------- Отображаем Группы МУ
    GroupMUModel = new QSqlQueryModel(this);
    GroupMUModel->setQuery("SELECT MUGroupCode, MUGroupName , MUGroupId "
                           "FROM sprMUGroup "
                           "ORDER BY 1");
    if(GroupMUModel -> lastError().isValid()){
      QMessageBox::critical(this,tr("Ошибка SQL"),GroupMUModel -> lastError().text());
      return;
    }
    ui->GroupMUView -> setModel(GroupMUModel);

    // ------- Отображаем Подгруппы МУ
    UnGroupMUModel = new QSqlQueryModel(this);
    UnGroupMUModel -> setQuery("SELECT * "
                               "FROM sprMUUnGroup ");
    if(UnGroupMUModel -> lastError().isValid()){
        QMessageBox::critical(this,tr("Ошибка SQL"),UnGroupMUModel -> lastError().text());
        return;
    }
    ui->UnGroupMUView -> setModel(UnGroupMUModel);
  
    // ------- Отображаем мед. услуги
    MUModel = new QSqlQueryModel(this);
    MUModel -> setQuery("SELECT * FROM sprMU ");
    if(MUModel -> lastError().isValid()){
        QMessageBox::critical(this,tr("Ошибка SQL"),MUModel -> lastError().text());
        return;
    }
    ui->MUView -> setModel(MUModel);

Код:
}

sprMU::~sprMU()
{
    delete ui;
}

void sprMU::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void sprMU::createButtons(){
    ui->GroupRefrButt -> setStyleSheet("QPushButton {border: none;padding: 4px;} QPushButton:hover {border: 2px outset #8f8f91;border-radius: 4px;} QPushButton:pressed {border: 2px inset #8f8f91;border-radius: 4px;}");
    ui->GroupAddButt -> setStyleSheet("QPushButton {border: none;padding: 4px;} QPushButton:hover {border: 2px outset #8f8f91;border-radius: 4px;} QPushButton:pressed {border: 2px inset #8f8f91;border-radius: 4px;}");
    ui->GroupEditButt -> setStyleSheet("QPushButton {border: none;padding: 4px;} QPushButton:hover {border: 2px outset #8f8f91;border-radius: 4px;} QPushButton:pressed {border: 2px inset #8f8f91;border-radius: 4px;}");
    ui->GroupDelButt -> setStyleSheet("QPushButton {border: none;padding: 4px;} QPushButton:hover {border: 2px outset #8f8f91;border-radius: 4px;} QPushButton:pressed {border: 2px inset #8f8f91;border-radius: 4px;}");
    connect(ui->GroupAddButt,SIGNAL(clicked()),this,SLOT(slotAddGroupMU()));


}

void sprMU::slotAddGroupMU(){
    QMessageBox::information(this,"","");
}

Убиваем выделенное красным или выносим в отдельную функцию, вызываемую после загрузки формы (или в отдельном потоке).

Соответственно пункт 1 моих и прочих предположений был верен.

PS извиняюсь перед господами, но в /code  цветом не выделяется Грустный


« Последнее редактирование: Октябрь 27, 2011, 13:07 от Bepec » Записан
boriss
Гость
« Ответ #9 : Октябрь 27, 2011, 13:27 »

Верес, я может чего-то не понимаю ...

Убиваем выделенное красным или выносим в отдельную функцию, вызываемую после загрузки формы (или в отдельном потоке).

Мне надо чтобы данные на форме заполнялись сразу при открытии основной формы ... А доп. форму, или в данном случае сообщение, я вывожу по клику на кнопке уже основной формы. Вот эта доп. форма, а в данном случае сообщение, выводится с небольшой задержкой.
Записан
Bepec
Гость
« Ответ #10 : Октябрь 27, 2011, 13:37 »

Уважаемый Борис.
Давайте я вам объясню что вы делаете:

Форма загружается, прорисовывается и ... ждет когда окончатся функции, описанные в конструкторе. У вас в данном случае запрос к БД, который кстати может быть и более длительным(до 10-15 секунд), в зависимости от расположения базы, ее величины и величины канала связи.

Это плохо! Очень плохо.

Мой вариант (мб и не очень простой):

Код:
Ваш_Класс::Конструктор
{
    //  прописываем все ui методы (создание кнопок, формы, настройка их)
    // далее создаем поток загрузки (потомок от QThread в моем случае)
    LoadThread * thread = new QThread();
}

В самом же потоке вы вызываете все свои запросы, и передаете данные в основной поток (при этом интерфейс не виснет, пользователь видит программу с пустыми полями).

Получаете данные из потока, устанавливаете в View, показывая их пользователю. Пользователю так же можно вывести что-то типа  "Запрос к базам данных выполняется бззз...".

Дополнительная форма у вас я думаю работает аналогично ( в конструктор Вы все запихали). Потому и метод решения тот же.

PS по опыту знаю, лучше пользователь видит пустые поля с сообщением о загрузке сразу, чем видит тормоза при загрузке и думает, что тормозит ВАША программа, а не БД.
Записан
boriss
Гость
« Ответ #11 : Октябрь 27, 2011, 13:42 »

Спасибо большое за разъяснения. Будем пробовать  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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