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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Вопрос о скорости компиляции и загруженности формы  (Прочитано 19585 раз)
Арктус
Гость
« : Июнь 26, 2009, 14:58 »

Здравствуйте.
В QT я новичек, поэтому хотелось бы узнать кое-что.

Вообщем, пишу небольшую утилитку-редактор.
И начиная с определенного момента, столкнулся с сильно возросшим времени компиляции проекта. Если в начале дебажная версия собиралась за 20-30 секунд, а релиз за 2 минуты, то сейчас дебаг занимает 5-7 минут, а компиляции релиза я так ни разу и не дождался.

Весь интерефейс состоит из одной формы, на который лежит QTabWidget. На каждом табе (а их сейчас 6) также расположен аналогичный QTabWidget, содержащий порядка 200 объектов (QLabel, QComboBox, QLineEditEdit).

Причина долгой компиляции строка ui->setupUi(this); Как я понимаю, это как раз и есть создание всего интерфейса.

Я выбрал Qt именно для того, чтобы набросать на форму нужные мне объекты, и забыть о интерфейсе, а тут такая подлянка.
Хотелось бы узнать, можно как-либо обуздать время компиляции, не пребегая к динамическому созданию интерфейса?
Или, есть ли возможность не пересобирать *.ui файл каждый раз, если изменений в нем не было? А то стоит поправить немного код, и здравствуй 7 минутный отдых.

Пользуюсь Qt SDK 4.5 (тот который by Nokia 2009.03)
Записан
spectre71
Гость
« Ответ #1 : Июнь 26, 2009, 15:03 »

Походу это проблемы твоего компилятора или среды.
У меня проект из ~200 модулей из них штук 20-30 ui форм, под VS 2005 полностью пересобирается за 5 минут
Записан
Арктус
Гость
« Ответ #2 : Июнь 26, 2009, 15:08 »

Не, я конечно знал, что MinGW медленный, но не настолько же.

Я все время пишу то под Borland, то под VS, и там с этим проблем не наблюдалось.

Т.е. придеться импортировать под студию чтоль?
Записан
spectre71
Гость
« Ответ #3 : Июнь 26, 2009, 15:09 »

Не думаю что проблема в MinGW
Записан
SABROG
Гость
« Ответ #4 : Июнь 26, 2009, 15:29 »

Цитировать
Или, есть ли возможность не пересобирать *.ui файл каждый раз, если изменений в нем не было?
А то стоит поправить немного код, и здравствуй 7 минутный отдых.
Если ничего не менял, то и перекомпиляции не должно быть. На основе .ui файла генерится хедер, а он никак не связан с тем, что ты поменял где-то код (если только не в нем самом).
---
Не связано с setup(ui), но может пригодится: http://wiki.qtcentre.org/index.php?title=Reducing_compilation_times

Еще можно почитать темы про redunant include guards, precompiled headers, forward declaration/forward reference. Также можно разбить приложение на библиотеки, чтобы не приходилось перекомпилировать весь код, уже скомпиленное просто линкуется.
« Последнее редактирование: Июнь 26, 2009, 15:35 от SABROG » Записан
Арктус
Гость
« Ответ #5 : Июнь 26, 2009, 16:13 »

Сейчас вот запроверил, собрал две дебажные версии:

7 табов (~1700 объектов) - 23 минуты
4 таба (~700 объектов) - 3 минуты

И это нормально?
Если закоментить тот самый ui->setupUi то все будет быстро и замечательно. (компиляция менее 1 минуты)
Для Qt это нормальная скорость пересборки интерфейса?

Просто к моменту завершения программы, у меня на форме будет порядка 6000 объектов, и мне что-то страшно.
Записан
ритт
Гость
« Ответ #6 : Июнь 26, 2009, 16:19 »

однозначно, проблема не в мингв, а у автора с манерой написания

> Просто к моменту завершения программы, у меня на форме будет порядка 6000 объектов, и мне что-то страшно.
мне тоже страшно...представить себе такой диалог...
Записан
Арктус
Гость
« Ответ #7 : Июнь 26, 2009, 16:23 »

Ну не хотелось мне создавать все это динамически.

Т.е. столь большое время компиляции прямое следствие большого числа объектов на форме?
Если да, то перепишу на динамику, шож делать.
Записан
ритт
Гость
« Ответ #8 : Июнь 26, 2009, 16:25 »

а можно увидеть h/cpp с этим-самым ui->setupUi() ?
Записан
Арктус
Гость
« Ответ #9 : Июнь 26, 2009, 16:31 »

Это те файлы, что создаются при создании нового GUI проекта.

cpp-файл
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

//-----------------------------------------------------------------------------------------------------------
//Конструктор
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    QDomDocument m_XMLFile("XMLFile");
    m_CurrentTab = 0;//Текущий таб 0

    ui->setupUi(this);

    //Привязка экшнов меню к слотам
    //Меню Файл
    connect(ui->actionOpen_File,SIGNAL(triggered()), this, SLOT(OpenFile()));
    connect(ui->actionSave_File,SIGNAL(triggered()),this,SLOT(Save()));ui->actionSave_File->setEnabled(false);
    connect(ui->actionExit, SIGNAL(triggered()), this, SLOT(Quit()));
    //Меню Модуль
    ui->actionStartModule->setEnabled(false);
    //Меню Справка
    ui->actionAbout->setEnabled(false);
    ui->actionAbout_Qt->setEnabled(false);

    //Привязка экшнов дерева
    connect(ui->m_XMLTree,SIGNAL(itemSelectionChanged()),this,SLOT(m_XMLTreeChange()));

    //Привязка экшенов табов
    //Таб Text
    connect(ui->m_btnTextTitleBgcolor,SIGNAL(clicked()),this,SLOT(ChooseTextTitleBgcolor()));
    connect(ui->m_btnTextHintBgcolor,SIGNAL(clicked()),this,SLOT(ChooseTextHintBgcolor()));
    connect(ui->m_btnTextParamSrc,SIGNAL(clicked()),this,SLOT(ChooseTextParamSrc()));
    connect(ui->m_btnTextHintSrc,SIGNAL(clicked()),this,SLOT(ChooseTextHintSrc()));
    connect(ui->m_btnTextAction0,SIGNAL(clicked()),this,SLOT(AddTextAction0()));
    connect(ui->m_btnTextAction1,SIGNAL(clicked()),this,SLOT(AddTextAction1()));
    connect(ui->m_btnTextAction2,SIGNAL(clicked()),this,SLOT(AddTextAction2()));
    connect(ui->m_btnTextAction3,SIGNAL(clicked()),this,SLOT(AddTextAction3()));
    connect(ui->m_btnTextAction4,SIGNAL(clicked()),this,SLOT(AddTextAction4()));
    connect(ui->m_btnTextAction5,SIGNAL(clicked()),this,SLOT(AddTextAction5()));
    connect(ui->m_btnTextAction6,SIGNAL(clicked()),this,SLOT(AddTextAction6()));
    connect(ui->m_btnTextAction7,SIGNAL(clicked()),this,SLOT(AddTextAction7()));
    //Таб Image
    connect(ui->m_btnImageTitleBgcolor,SIGNAL(clicked()),this,SLOT(ChooseImageTitleBgcolor()));
    connect(ui->m_btnImageHintBgcolor,SIGNAL(clicked()),this,SLOT(ChooseImageHintBgcolor()));
    connect(ui->m_btnImageParamSrc,SIGNAL(clicked()),this,SLOT(ChooseImageParamSrc()));
    connect(ui->m_btnImageHintSrc,SIGNAL(clicked()),this,SLOT(ChooseImageHintSrc()));
    connect(ui->m_btnImageAction0,SIGNAL(clicked()),this,SLOT(AddImageAction0()));
    connect(ui->m_btnImageAction1,SIGNAL(clicked()),this,SLOT(AddImageAction1()));
    connect(ui->m_btnImageAction2,SIGNAL(clicked()),this,SLOT(AddImageAction2()));
    connect(ui->m_btnImageAction3,SIGNAL(clicked()),this,SLOT(AddImageAction3()));
    connect(ui->m_btnImageAction4,SIGNAL(clicked()),this,SLOT(AddImageAction4()));
    connect(ui->m_btnImageAction5,SIGNAL(clicked()),this,SLOT(AddImageAction5()));
    connect(ui->m_btnImageAction6,SIGNAL(clicked()),this,SLOT(AddImageAction6()));
    connect(ui->m_btnImageAction7,SIGNAL(clicked()),this,SLOT(AddImageAction7()));
    //Таб Audio
    connect(ui->m_btnAudioTitleBgcolor,SIGNAL(clicked()),this,SLOT(ChooseAudioTitleBgcolor()));
    connect(ui->m_btnAudioParamSrc,SIGNAL(clicked()),this,SLOT(ChooseAudioParamSrc()));
    connect(ui->m_btnAudioAction0,SIGNAL(clicked()),this,SLOT(AddAudioAction0()));
    connect(ui->m_btnAudioAction1,SIGNAL(clicked()),this,SLOT(AddAudioAction1()));


    //Настройка доступности табов в начале
    for (int i = 1; i < ui->m_tabwTags->count();i++)
        ui->m_tabwTags->setTabEnabled(i,false);

    ui->m_tabText->setVisible(false);
}
//-----------------------------------------------------------------------------------------------------------
//Деструктор
MainWindow::~MainWindow()
{
    delete ui;
}

h-файл
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QTreeWidget>
#include <QList>
#include <QtXml>
#include <QFileDialog>
#include <QColorDialog>

namespace Ui
{
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    //Основные функции
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void SaveChanges();//mainFuncSaveChanges.cpp

    //Вспомогательные функции : MainWindowOtherFunc.cpp
    void createXMLTree(QTreeWidgetItem*, QDomNode);
    QString GetLastParent(QTreeWidgetItem*);
    QDomNode GetLastParentXML(QDomNode);
    int GetNodeCounted(QDomNodeList);
    QDomNode SelectedNode(QDomNodeList, int);
    int XMLTreeNodeCounted(QTreeWidgetItem*);
    int XMLTreeChildSelected(QTreeWidgetItem*);
    int XMLTreeSelectInd();
    void SelectTreeNode(QTreeWidgetItem*, int);
    void IdLoad(QDomNode);


public slots:
    virtual void m_XMLTreeChange();//mainFuncXMLTreeChanges.cpp
    //MainMenuSlots.cpp
    virtual void OpenFile();
    virtual void Save();
    virtual void Quit();

    //Слоты для Text : tabText.cpp
    virtual void ChooseTextTitleBgcolor();
    virtual void ChooseTextHintBgcolor();
    virtual void ChooseTextParamSrc();
    virtual void ChooseTextHintSrc();
    virtual void AddTextAction0();
    virtual void AddTextAction1();
    virtual void AddTextAction2();
    virtual void AddTextAction3();
    virtual void AddTextAction4();
    virtual void AddTextAction5();
    virtual void AddTextAction6();
    virtual void AddTextAction7();

    //Слоты для Image : tabImage.cpp
    virtual void ChooseImageTitleBgcolor();
    virtual void ChooseImageHintBgcolor();
    virtual void ChooseImageParamSrc();
    virtual void ChooseImageHintSrc();
    virtual void AddImageAction0();
    virtual void AddImageAction1();
    virtual void AddImageAction2();
    virtual void AddImageAction3();
    virtual void AddImageAction4();
    virtual void AddImageAction5();
    virtual void AddImageAction6();
    virtual void AddImageAction7();

    //Слоты для Audio : tabAudio.cpp
    virtual void ChooseAudioTitleBgcolor();
    virtual void ChooseAudioParamSrc();
    virtual void AddAudioAction0();
    virtual void AddAudioAction1();

private:
    Ui::MainWindow *ui;
    QDomDocument m_XMLFile;
    QDomNodeList m_NodeList;//Список корневых узлов XML документа
    QDomNode m_NodeSelected;//Выбранный тег
    QDomNode m_NodeParentSelected;//Основной родитель выбранного тега
    int m_CurrentTab;//Номер текущего таба
    QString m_strFileName,//Имя рабочего файла
            m_strModuleDir,//Папка модуля
            m_strModuleSrcDir;//Папка ресурсов модуля
};

#endif // MAINWINDOW_H

Все это под виндой делаю.
Записан
Rcus
Гость
« Ответ #10 : Июнь 26, 2009, 16:41 »

Помоему надо не это смотреть, а вывод uic (ui_*.h), чувствую компилятору плохо от большого количества переменных в одном классе/методе.
Я бы разнес табы по разным классам, так легче будет организовать раздельную компиляцию, а actions разделяемые разными табами организовать в коллекции.
Записан
SABROG
Гость
« Ответ #11 : Июнь 26, 2009, 16:52 »

К теме не относится, просто наблюдение.
Код
C++ (Qt)
   connect(ui->m_btnImageAction0,SIGNAL(clicked()),this,SLOT(AddImageAction0()));
   connect(ui->m_btnImageAction1,SIGNAL(clicked()),this,SLOT(AddImageAction1()));
   connect(ui->m_btnImageAction2,SIGNAL(clicked()),this,SLOT(AddImageAction2()));
   connect(ui->m_btnImageAction3,SIGNAL(clicked()),this,SLOT(AddImageAction3()));
   connect(ui->m_btnImageAction4,SIGNAL(clicked()),this,SLOT(AddImageAction4()));
   connect(ui->m_btnImageAction5,SIGNAL(clicked()),this,SLOT(AddImageAction5()));
   connect(ui->m_btnImageAction6,SIGNAL(clicked()),this,SLOT(AddImageAction6()));
   connect(ui->m_btnImageAction7,SIGNAL(clicked()),this,SLOT(AddImageAction7()));
 

Вместо этих портянок достаточно одного слота и QButtonGroup/QActionGroup, в который можно объединить в design mode.
Я всё-таки думаю, что проблема долгой компиляции в том, что постоянно редактируется .ui форма, которая в свою очередь влияет на ui_*.h файл. Муки должны закончится, когда интерфейс будет полностью готов.
Записан
Арктус
Гость
« Ответ #12 : Июнь 26, 2009, 17:12 »

А
Цитировать
Вместо этих портянок достаточно одного слота и QButtonGroup/QActionGroup, в который можно объединить в design mode.
и
Цитировать
а actions разделяемые разными табами организовать в коллекции.

Это об одном?
В design mode не углядел нчие такого, мож плохо смотрел.

В любом случае, оно не критично, лишь повышает удобство восприятия кода, на мой взгляд.
Записан
SABROG
Гость
« Ответ #13 : Июнь 26, 2009, 17:21 »

В design mode не углядел нчие такого, мож плохо смотрел.
В любом случае, оно не критично, лишь повышает удобство восприятия кода, на мой взгляд.

Для кнопок "Assign To Button Group", а для экшенов такого почему-то не сделали. Но думаю не будет проблемой получить список через QWidget::actions() и через foreach добавить в QActionGroup.
Записан
Арктус
Гость
« Ответ #14 : Июнь 26, 2009, 18:22 »

Я бы разнес табы по разным классам, так легче будет организовать раздельную компиляцию.

Ни у кого под рукой ссылки на пример подобной реализации элементов интерфейса в разных классах?
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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