Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++ FAQ > Что такое QT и с чем его едят ?


Автор: Allender 30.03.04, 07:48
Естественно, из меня писатель как из бутылки молоток, так что уж простите, если увидети выдержки из какой-либо знакомой вам доселе не обессудте :-)))
И огромное спасибо uj за оказанную помощь в разработке статьи!!! Респект :-=))
И так... поехали!...

1. Что такое QT?
=================
Qt -- это кроссплатформенная библиотека, целью которой является вытеснение нативных API из ваших
программ. Сейчас Qt -- это огромный объектно-ориентированный комбайн, в большинстве случаев
позволяющий обойтись без привлечения каких-либо иных библиотек.
В первую очередь Qt -- отличное средство для создания графического пользовательского
интерфейса (GUI). В состав Qt входит дизайнер, позволяющий легко создавать графические интерфейсы
для вашего приложения.
Вам не придется заботиться о написании файлов сборки для каждой из платформ, за вас это сделают Qt.
Достаточно просто написать файл проекта, в который внести все используемые файлы, и файл
сборки можно будет создать одним вызовом утилиты qmake (естественно, под управлением целевой
платформы). От себя добавлю, что иногда этот файл приходится править руками (а как же).
О значимости данной библиотеки говорит хотя бы то, что она используется в таких успешных проектах,
как Borland C++ Builder 6 и Opera.

2. Где достать?
================
Библиотека поставляется по нескольким лицензиям, одни из которых -- платные, другие -- нет. Под
оконную систему X11 всегда можно с сайта www.trolltech.com легально
взять GPL-версию Qt (и использовать, естественно, только
в некоммерческих проектах). С системой Windows дело обстоит сложнее, поскольку, по мнению верхушки
TrollTech, эта система не является ареной OpenSource-разработки. Последняя бесплатная версия для
Windows -- 2.3.0. Но для находчивых людей это не проблема, есть сеть eDonkey ;-) Текущей на данный
момент является версия 3.3.1. В скором времени ожидается версия 4.

3. Технические подробности
=============================
Изначало Qt "работало" на пользовательский интерфейс. И именно поэтому эта часть библиотеки наиболее
используема и наиболее развита. Интересен подход к позиционированию виджетов (виджет -- элемент
GUI, всё что рисуется на окошке, включая его само) -- система слоёв (layout) позволяет вам забыть об абсолютном позиционировании, как о страшном сне. Теперь класс Layout сам следит за тем, что вы делаете с, например, главным окном и позиционирует все внутренние виджеты вслед за изменением геометрии этого окошка.
Центральной идеей Qt является сигнально-слотовый механизм, реализующий взаимосвязь между объектами.
Этот механизм реализован посредством прекомпиляции, что позволяет использовать его без всяких
ухищрений (если вы заинтересованы в Qt, прямо в данный момент забудьте о callback-вызовах ).
Каждый Qt-объект (не только вызуальные элементы!) может генерировать некоторые сигналы, жестко
зашитые в структуру его класса. Сигнал -- это функция, объявленная в специальной секции signals
и не имеющая реализации ("тела") а только передаваемые аргументы. К сигналу объекта (заметьте, не класса) могут быть подключены слоты. Слот -- это всего лишь метод, также объявленный в специальных секциях "slots". Слоты
могут быть доступными (секция "public slots"), защищенными ("protected slots") и
скрытыми ("private slots"). При помощи специального метода connect слот подсоединяется к сигналу.
Небольшой пример:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
      connect(myValueDetector, SIGNAL(ValueChange( Value a),
              myApplicationUpdater, SLOT(onValueChange( Value a ))));



После чего при каждом "испускании" сигнала ValueChange объектом myValueDetector
будет вызываться слот onValueChange объекта myApplicationUpdater.
Плюсы -- к одному сигналу можно подключить несколько слотов.
Минусы -- один слот нельзя использовать для нескольких сигналов (например, для обработки группы кнопок). Сравните с системой событий VCL/CLX -- там как раз всё наоборот. Рассмотрим небольшой пример использования сигнально-слотового механизма:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    //то, что инициирует сигнал для изменения
    class aValueDetector:public QObject
    {
      Q_OBJECT // нужно для объявления сигналов и слотов
    public:
        aValueDetector( Value a );
    signals:
        ValueChange( Value a );
    }
    //то, что его сможет обработать
    class aApplicationUpdater:public QObject
    {
      Q_OBJECT
    public:
        aApplicationUpdater();
    public slots:
        onValueChange( Value a );
    }
    // то, что всем управляет
    class aApplication
    {
    public:
        aApplication()
    {
    //некоторый код
    ..................
    //а вот теперь самое главное
      connect(myValueDetector, SIGNAL(ValueChange( Value a )),
              myApplicationUpdater, SLOT(onValueChange( Value a ))));
    // причем, заметьте, один сигнал может вызывать и другой сигнал и иметь несколько коннектов
    // одновременно
    }
    protected:
        aValueDetector*      myValueDetector;
        aApplicationUpdater* myApplicationUpdater;
    }



Как видите, код "немного" отличается от стандартного C++. Данный текст подаётся на вход мета-компилятора moc, который из него уже производит стандартный код C++, который затем компилируется любым компилятором. Moc отличает "свои", т.е. поддерживающие сигнально-слотовый механизм, классы от стандартных по ключевому слову Q_OBJECT в самом начале объявления класса.

Перечислим основные достоинства ядра библиотеки Qt:
* встроенная поддержка Unicode и локализации (очень хорошо и очень правильно реализованной, смею
заметить). В Qt4 обещают новый механизм рендеринга шрифтов, поддерживающий Unicode.
* мощные события и фильтры событий (событие - это что-то вроде универсального сигнала, который можно посылать любому виджету, распознавать и соотвествующим образом обрабатывать с помощью фильтров. Например нажатие различных клавиш)
* многофункциональные управляемые интервалами таймеры которые делают возможным просто и быстро
вставлять много разных заданий в управляемый событиями ГПИ.
* иерархические и настраиваемые объектные деревья, организующие принадлежность объектов естественным
образом.
* защищенные указатели QGuardedPtr, которые автоматически принимают значение NULL при
уничтожении соответствующего объекта, в отличие от обычных указателей в C++, которые в этом
случае становятся "неопределенными указателями".
* Удобная документация, доступная и на русском языке (ссылки к сожалению не знаю, но могу с удовольствием выслать по заявке).

В состав ядра библиотеки входят как классы для построения GUI (например: метка, поле ввода, кнопка и
т.п.), так и классы, предназначенные для организации различных струтур хранения данных (например,
списковых), работы с файлами, сетевого взаимодействия и многого другого. Некоторые из этих
возможностей реализованы в виде дополнительных модулей:
* модуль Canvas, мощный инструмент для работы с двухмерной графикой. Он использует принцип
структурирования графики, что, несомненно, будет полезно в программировании простых двухмерных
игр и подобного рода вещах. Холст состоит из нескольких "элементов", каждый элемент представлен
объектом. Поддерживается также ряд интересных возможностей, таких как collision-detection, перемещение(нет во фришных версиях под виндой :-((( )
объектов с определенными скоростями по осям. Подробнее читаем по ссылке:
Ссылка
* модуль Network, обеспечивающий поддержку сети в приложениях.
* модуль OpenGL, позволяющий работать с трехмерной графикой при помощи портабельной библиотеки
OpenGL. Поддерживается с версии 2.3.2.
* модуль SQL, реализующий доступ к базам данных из приложений Qt. Данный модуль разбит на три уровня:
пользовательский (элементы интерфейса), программный (абстрактный доступ к базам данных) и уровень
драйверов.
* модуль Table, предоставляющий в ваше распоряжение сетку для отображения табличных данных. Сетка
являет собой очень мощный и гибкий интерфейс, работать с которым -- одно удобольствие
* модуль XML, использующий интерфейс SAX2 и реализацию DOM второго уровня.

Это далеко не полный перечень возможностей Qt.

3. Как написать простенькое приложение на QT?
=================================================
Напишем файлик main.cpp следующего содержания:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    #include <qapplication.h>
    #include <qpushbutton.h>
    int main( int argc, char **argv )
    {
        QApplication a( argc, argv );          // ну понятно, что без аппликухи никуда :-)
        QPushButton hello( "Привет, Мир!", 0 ); // Создаём простенькую кнопочку
        hello.resize( 100, 30 );                // растягиваем её, можно при желании и на весь экран :-)
        a.setMainWidget( &hello );              // Делаем кнопку основным виджетом, это нужно для того, чтобы при закратии этой самой кнопки всё приложение завершило свою работу
        hello.show();                          // это чтобы нашу красоту все увидели :-)
        return a.exec();                        // и как говориться "Поехали" copyright by Y. Gagarin :-)
    }



Теперь напишем файл проекта под это дело (simple.pro):
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    PROJECT                = simple
    TEMPLATE                = app
    CONFIG                  = qt warn_on debug
    SOURCES                = main.cpp
    TARGET                  = simple



В командной строке наберем:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    qmake simple.pro




И теперь черед утилиты make: приложение готово Запускаем, наблюдаем окошко с кнопочкой.

Автор: uj 19.04.04, 19:45
В принципе ничо так написал, респект :) Но есть и недочеты. Во-первых, не "механизм называемый сигналы и слоты", а сигнально-слотовый механизм. Во-вторых, ты его сбивчиво как-то объяснил. Если хошь, я могу попробовать доработать статью и тебе послать куда-нибудь, а потом ты доработаешь и т.п. :) Плюс тебе :)

Автор: Allender 20.04.04, 08:34
Цитата uj @ 19.04.04, 22:45
В принципе ничо так написал, респект :) Но есть и недочеты. Во-первых, не "механизм называемый сигналы и слоты", а сигнально-слотовый механизм. Во-вторых, ты его сбивчиво как-то объяснил. Если хошь, я могу попробовать доработать статью и тебе послать куда-нибудь, а потом ты доработаешь и т.п. :) Плюс тебе :)

Конечно посылай, доработаю и конечно же твой копирайт поставлю :-))))
Ведь со стороны оно в таких делах всегла виднее... :-)

Автор: uj 20.04.04, 20:35
ну, по привату ушло :)

Автор: Allender 27.04.04, 07:25
Цитата uj @ 20.04.04, 23:35
ну, по привату ушло :)

Про фильты дописал, только вот с ХML проблема...

Автор: uj 27.04.04, 12:23
я подробнее описать XML не могу, поскольку работал с ним всего пару раз и в подробности DOM и SAX не углублялся.. Хотя, в доке написано, что поддерживает полностью DOM level 2 и SAX2 (в процессе разработки). Единственное что могу сказать про XML -- могли бы и удобное что-то сделать (окромя точной реализации DOM), а то через все эти QDomElement лазить, чтоб достать какую-то настройку, достаёт конкретно :(

Автор: Tuzik[KARAVAN] 11.05.04, 07:44
Цитата
Теперь класс Layout сам за тем, что вы делаете с, например, главным окном и позиционирует все внутренние виджеты вслед за изменением геометрии этого окошка.

Я так подозреваю что тут после "Теперь класс Layout сам" пропущено слово.. например "следит".. :)

Автор: Allender 11.05.04, 09:49
Цитата Tuzik[KARAVAN
,11.05.04, 10:44]
Цитата
Теперь класс Layout сам за тем, что вы делаете с, например, главным окном и позиционирует все внутренние виджеты вслед за изменением геометрии этого окошка.

Я так подозреваю что тут после "Теперь класс Layout сам" пропущено слово.. например "следит".. :)

Спасибо, уже исправил :-)))

Автор: Valery 14.05.04, 09:39
и вот тут - "...вытеснение наивных API из ваших..."
наверное "нативных" имелось в виду, мелочь конечно

Автор: uj 14.05.04, 19:31
угу, очепятались :) Allender, исправляй :) Кстати, есть идея написания The-Not-So-Short-Tutorial-To-Qt (или перевода охвициального туториала). Кто что думает по этому поводу?

Автор: Technos 15.05.04, 09:56
Было бы супер!:) Или какойнить туториал написания маленького проектика степ бай степ. Многие вопросы сами собой бы отпали в таком случае :)

Автор: uj 15.05.04, 13:11
ну там у них оффициальные туториалы вполне хорошие :) Только вопрос появился, туториал какой версии Qt лучше переводить? Потому что в ветке 3 туториалы совсем другие, новые, а в ветке 2 (последняя бесплатная версия под винду) -- старые :)

FAQP.S. "- а третью win-commercial версию достать можно?
- можно ;)"

Автор: Technos 15.05.04, 13:17
3 версию переводить! Под линухои то валит:)

Автор: uj 15.05.04, 13:22
ок, попробую. Начну с первого туториала. Результаты, если что, выложу тут. Если кто хочет помочь и перевести другие туториалы -- you're welcome :)

Автор: Allender 17.05.04, 07:52
Цитата uj @ 14.05.04, 22:31
угу, очепятались :) Allender, исправляй :) Кстати, есть идея написания The-Not-So-Short-Tutorial-To-Qt (или перевода охвициального туториала). Кто что думает по этому поводу?

Есть, исправлено :-))))

Кстати, uj, если уж ты решил заняться туториалом, может быть тогда мне OpenGL заняться?

Попробую написать, что-то вроде простенького GL-го вьювера для картинок с использованием QT ;-)))
Небольшой опыт в этом уже есть....

Как вам эта идея?

Автор: uj 17.05.04, 12:53
займись :) мне бы, например, было бы тоже интересно про GL в Qt почитать :)

Автор: Technos 29.05.04, 13:08
Ну как там продолжение? Будет?:)

Автор: Technos 29.05.04, 23:47
Интересует следующее QtGL можно совместить с нативным Qt GUI? Тоесть OGL вьювер картинок например с удобным оконным интерфейсом?

Автор: uj 30.05.04, 14:37
Цитата
Ну как там продолжение? Будет?


будет, но попозже. У меня сейчас предсессия, через неделю -- сама сессия :( завал... Так что где-то после середины июня займусь...

Цитата
Интересует следующее QtGL можно совместить с нативным Qt GUI? Тоесть OGL вьювер картинок например с удобным оконным интерфейсом?


конечно. смотри examples\opengl, в частности, дему box.

Автор: Allender 24.06.04, 06:56
ВСЕМ ПРИВЕТ!!!
Вотя тут кое чего написал :-))))
Это для тех, кто хочет сразу посмотреть
Это для тех, кто хочет сам откомпиляться или траффик на 1 метр жалко

Все сорца снабжены подробными комментариями, а если что-то не ясно, то милости просим :-))
Обращайтесь:-)))

Кстати, хочу сделать следующую версию уже с ToolBars и сменой курсора, да и операций немного добавить :-)))

Блин!!! Я тут в main забыл кое что добавить и теперь приложение остаётся висеть после закрытия окна....
ВОт правильная версия
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    int main( int argc, char **argv )
    {
        QApplication app( argc, argv );
        
        PV_Application* aApplication = new PV_Application();
        app.setMainWidget( aApplication );
        aApplication->show();
     
        return app.exec();
    }

Автор: DEiL 11.07.04, 11:12
с trolltech.no нельзя скачать версию Qt под GPL! ибо Троллтехи придумали свою лицензию :-)
которая запрещает продавать свои программы, использующие их библиотеку. для этого придётся-таки заплатить несколько килобаксов на коммерческую лицензию :-)

Автор: Allender 12.07.04, 10:10
Цитата deil @ 11.07.04, 14:12
с trolltech.no нельзя скачать версию Qt под GPL! ибо Троллтехи придумали свою лицензию :-)
которая запрещает продавать свои программы, использующие их библиотеку. для этого придётся-таки заплатить несколько килобаксов на коммерческую лицензию :-)

А ты думал? :-)))
У них есть фришная версия 2.3.0
Если хочешь, то могу выслать на мыло...

Автор: Kutushut 18.10.04, 11:41
Раз уж это FAQ, надо писать только правду :)

Цитата
Плюсы -- к одному сигналу можно подключить несколько слотов.
Минусы -- один слот нельзя использовать для нескольких сигналов (например, для обработки группы кнопок).


- К одному сигналу можно подключить сколько угодно слотов. Trolltech не гарантирует порядок их вызова, гарантируется только что вызваны будут все. Подробности можно узнать из описания работы moc или просто посмотрев moc-файлы.

- К одному слоту можно подключить сколько угодно сигналов.
Если я правильно понял автора - он имел в виду идентификацию объекта-отправителя в слоте. По этому поводу стоит посмотреть класс QSignalMapper.

Да, еще забыли упомянуть про qt-mt - многопоточное программирование. Правда, на мой неискушенный взгляд, не слишком удобно этим пользоваться.

Автор: Allender 24.11.04, 12:49
Цитата Kutushut @ 18.10.04, 14:41
- К одному слоту можно подключить сколько угодно сигналов.
Если я правильно понял автора - он имел в виду идентификацию объекта-отправителя в слоте. По этому поводу стоит посмотреть класс QSignalMapper.

Да, я тут неськоль был неправ.
Недавно я сам с этим столкнулся и вот как выкрутился.
Я просто в теле слота спросил имя класса отправителя(если отправитель всегда один и тотже то можно завести идентификатор или сравнивать указатели) через метод:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    class QObject
    {
    //....
    protected:
      const QObject * sender ()
    //...
    }


И уж дальше тогда с этим объектом разбираться как вам заблагорассудится :-)))

Автор: Kutushut 01.12.04, 11:08
Цитата Allender, 24.11.04, 15:49, 521931
Да, я тут неськоль был неправ.
Недавно я сам с этим столкнулся и вот как выкрутился.
Я просто в теле слота спросил имя класса отправителя(если отправитель всегда один и тотже то можно завести идентификатор или сравнивать указатели) через метод:


Мне кажется стоит раскрыть эту тему поподробнее.

Во-первых, всегда есть 2 варианта:
1. Нужно просто знать какой объект прислал сигнал. Классический пример - кнопки калькулятора. В этом случае нужно использовать QSignalMapper, а не строить велосипеды:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    virtual void setMapping ( const QObject * sender, int identifier ) или
    virtual void setMapping ( const QObject * sender, const QString & identifier )
    устанавливает соответствие QObject идентификатору, затем объекты шлют сигнал на слот
    void map ()
    после чего испускается сигнал
    void mapped ( int ) или
    void mapped ( const QString & )
    соответственно.


2. Нужно не только знать объект, но он еще передает значимые данные. Правда, тут стоит задуматься откуда взялось такое узкое место, в котором собираются данные от разных источников с определением источника.
В любом случае
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    2а. QObject поддерживает метод
    virtual const char* className () const,
    возвращающий имя класса (естественно, если он объявлен с Q_OBJECT и обработан moc)
    сравнить имя можно методом
    bool isA ( const char * ) const
     
    альтернативный путь -
     
    2b. установить имя при создании объекта
    QObject ( QObject * parent=0, const char * name=0 )
    и затем считать через
    const char* name () const


Вариант с хранением указателя тоже возможен и практически равнозначен варианту 2b. Однако, стоит помнить, что эти методы привязываются к экземпляру, в то время как вариант 1а определяет имя класса, и выбирать нужный.

Автор: Adil 02.05.05, 11:24
Цитата Allender @
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    int main( int argc, char **argv )
     {
       QApplication app( argc, argv );
       PV_Application* aApplication = new PV_Application();
       app.setMainWidget( aApplication );
       aApplication->show();
       return app.exec();
    }
Мда... Может, я что-то не допонял - Qt - это что-то вроде perl или java? ;) Сюдя по тому, что этот код
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <qapplication.h>
    #include <qpushbutton.h>
    int main( int argc, char **argv )
    {
      QApplication a( argc, argv );// ну понятно, что без аппликухи никуда :-)
      QPushButton *hello=new QPushButton ( "Hello, world!", 0 ); // Создаём простенькую кнопочку
      hello->resize( 100, 30 );   // растягиваем её, можно при желании и на весь экран :-)
      a.setMainWidget( hello ); // Делаем кнопку основным виджетом, это нужно
                                 //для того, чтобы при закратии этой самой кнопки
                                 //всё приложение завершило свою работу
      hello->show();          // это чтобы нашу красоту все увидели :-)
      int ret=a.exec();       // и как говориться "Поехали" copyright by Y. Gagarin :-)
      hello->show();          // а теперь попробум еще раз
      ret=a.exec();
      // попробовали - объект-то - как новенький!
      delete hello;  //был...
      return ret;
    }
работает на "ура" - это все-таки С: кто память-то за собой подчищать будет?

Автор: Kutushut 23.05.05, 09:31
Adil
Что самое смешное, эта традиция от Тролтехов. Специально влез в их примеры, и вот что увидел:

В новом пишут правильно:
http://doc.trolltech.com/4.0/widgets-analogclock-main-cpp.html
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        int main(int argc, char *argv[])
        {
            QApplication app(argc, argv);
            AnalogClock clock;
            clock.show();
            return app.exec();
        }


А в старом так и не поправили

http://doc.trolltech.com/3.0/qaction-application-example.html
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    int main( int argc, char ** argv ) {
        QApplication a( argc, argv );
        ApplicationWindow * mw = new ApplicationWindow();
        mw->setCaption( "Document 1" );
        mw->show();
        a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) );
        return a.exec();
    }


Но кажется процесс идет, по крайней мере про 2.3.10 большинство таких ляпов закрыли.

А вот в книжках по Qt деструкторы не вызывают - топором уже не порубаешь.

Видимо, замечание в фак по Qt можно сформулировать таким образом:

Несмотря на многочисленные примеры, для всех объектов, созданных через new (в том числе наследников QObject) необходимо явно вызывать деструкторы.

;)

Автор: Antoxa1985 22.09.05, 10:55
Цитата Kutushut @
А вот в книжках по Qt деструкторы не вызывают - топором уже не порубаешь.
Вот перед мною лежит книжка (бумажная, 200 руб отдал) Qt 3 ... авторы: Жасмин Бланшет,Марк Саммерфилд; еще подпись есть - Официально одобренно компанией TrollTech, открываю 1 из первых глав и ...
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    int main( int argc, char ** argv ) {
        QApplication a( argc, argv );
        QLable l *  = new QLable("bla-bla",0);
        a.setMainWidget(l);
        l->show();
        return a.exec();
    }

:lool:

Автор: Adil 22.09.05, 12:00
Сейчас вдруг усомнился - а вдруг widget удаляется в деструкторе QApplication? Все-таки указатель-то туда передается (a.setMainWidget). Проверил:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ...
    class QTestBtn : public QPushButton
    {
    public:
      QTestBtn(char* cap,QWidget* qw) : QPushButton(cap, qw)
      {
        FILE *fop=fopen("dubug.dbg","a+t");
        if(fop)
        {  
          fprintf(fop,"\n*******************\n\tQTestBtn constr");
          fclose(fop);
        }
      }
      virtual ~QTestBtn()
      {
        FILE *fop=fopen("dubug.dbg","a+t");
        if(fop)
        {  
          fprintf(fop,"\n\t~QTestBtn destr\n####################");
          fclose(fop);
        }
      }
    };
     
    int main( int argc, char **argv )
    {
      QApplication a( argc, argv );// ну понятно, что без аппликухи никуда :-)
      QPushButton *hello=new QTestBtn ( "Hello, world!", 0 ); // Создаём тестовую кнопочку
      a.setMainWidget( hello ); // Делаем кнопку основным виджетом
      hello->show();          // это чтобы нашу красоту все увидели :-)
      int ret=a.exec();       // и как говориться "Поехали" copyright by Y. Gagarin :-)
      //delete hello;  
      return ret;
    }
Ан-нет, при закоментированном delete hello; деструктор ~QTestBtn не вызывается, если открыть - то Ок. Вот тебе и C++.

Автор: Antoxa1985 22.09.05, 13:35
Adil, кстати, я тоже сначала подумал, что QApplication разрулит ситуацию, ломанулся в qassistant, а там сказано, дескать, никто не будет за вас вашу работу, раз создали на куче, значит сносите объект сами.

P.S. я проверял на 3.3.3/3.3.4, интересно, что 4.0/4.0.1 думают по этому поводу?

Автор: Adil 22.09.05, 13:52
Цитата Antoxa1985 @
ломанулся в qassistant, а там сказано, дескать, никто не будет за вас вашу работу, раз создали на куче, значит сносите объект сами.
Нет, ну это может и правильно, во всяком случае один из допустимых подходов, - иначе как в VCL получится - объекты только на куче можно создавать. Но зачем в своих же экзамплах ошибки делать?

Автор: Antoxa1985 23.09.05, 05:29
манагеры наверное хелп делали, кстати один из авторов книги - менеджер по документированию :)

Сообщения были разделены в тему "On Screen Display text?"

Автор: Kutushut 28.02.06, 12:18
Добавление в FAQ. Несколько типичных проблем, которые проявляются в "глюках" и сегфолтах. Думаю, многое известно, просто надо куда-то людей посылать :)

1. Библиотеки vs Qt. Точно известно насчет .so, думаю в винде та же ситуация.
Экземпляр QApplication должен создаваться в основной программе. Проблема создания форм (и других Q-объектов) стоит не так остро, если не считать некоторых особенностей удаления.

2. Многопоточность (не QThreads) vs Qt. Все, что касается отношений QObject-ов, должно происходить в одном потоке. Соответственно, если QApplication создается в основном, все остальное тоже должно вызываться из него. Безопасность по чтению в принципе гарантируется, но в недрах doc.trolltech не рекомендовали. Библиотека qt-mt поддерживает многопоточность, но в этом случае нужно создавать потоки через QThread и полностью использовать многопоточную модель от троллтехов. Смешивать ее с какой-то другой крайне не рекомендуется.

3. std vs Qt. Смешивать нельзя. Особенно это касается контейнеров - в std-шных нельзя хранить Qt-шные объекты. В Qt есть свои контейнеры, нужно использовать их. Корни этой проблемы уходят в способы хранения, фактически, большинство Qt контейнеров хранят указатели, хотя внешне все выглядит как хранение по значению. Если учесть, что std обеспечивает намного больший функционал (даже если не брать буст), стоит для задач, не связанных с графикой, переходить к std и pod типам и помещать их в стандартные контейнеры.

4. Сборка под разными дистрибутивами.
4.1 По умолчанию Qt включает некоторое количество инклудов. Например, в slackware они находятся в /usr/lib/qt/mkspecs/default. Чтобы в дальнейшем избежать проблем, связанных с разными версиями, стоит закомментировать все инклуды в этом файле и собирать так. Сразу вылезут stdlib.h и ему подобные. Другой способ - завести свой файл со стандартными инклудами.
4.2 Начиная с версии 3.0.0 в состав qt входит утилита qmake, создающая Makefile по файлу .pro. Во многих случаях при переходе межу системами и версиями рекурсивная обработка каталогов не работает. Проще всего из скрипта рекурсивно обойти все подкаталоги, запустив в них qmake. Возможно, есть способ лучше, но этот работает и не зависит от версии.

ЗЫ: что делается на 4-й серии не знаю, пока в работе 3.3.3 и более старые версии.

Автор: энерджи 18.02.07, 22:55
Может в связи с уже давним выходом 4ой версии этой замечателньой библиотеки воскресим тему ?)

Автор: AngelPS 23.05.07, 13:41
русский перевод документации можно выложить?

Автор: =MOHAX= 26.05.07, 04:24
И было бы ооооочень неплохо научиться интегрировать QT в MSVC 2005. У меня так и не получилось :(

Автор: neooleg 28.09.07, 20:15
Цитата =MOHAX= @
И было бы ооооочень неплохо научиться интегрировать QT в MSVC 2005. У меня так и не получилось :(

Может QT&VS8 ;)

Автор: Mizantrop 18.10.07, 17:12
Очень надо мануальчика по QtXML))))Профи, набросайте, если время будет)

Автор: Орион 22.10.07, 07:53
Как подружить VisuallAssist с Qt? Чет не получается, блин.
M
Подобные вопросы надо задавать в "Сопутствующих вопросах"
Рано или поздно(но скорее рано) здесь будут произведена генеральная уборка с удалением подобных сообщений

Автор: FFF1 23.10.07, 15:48
Я сильно удивляюсь, почему например автор, имеющий нормальную версию под винду не выложил все в одном архиве - ну залил бы на рапиду например.
Я вот уже задаелся искать, у меня нифига она не собирается под виндой и т.п.
Было бы очень здорово если бы был архив, в котором лежит компилятор нужный (у меня MinGW), сама Qt, которая РАБОТАЕТ на этом компилере, плагин для Eclipse и сама Eclipse. Чтоб все это без геморрою можно было вместе использовать. А то уже ненавидеть опенсурс начинаешь, т.к. все у них через жопу - то Qt не собирается, то плагин к эклипсу не подключается.. А Визуал Студию берешь - все сразу работает, время не тратишь на всякие глупости.

Автор: archimed7592 27.10.07, 06:14
FFF1, разуй глаза: qt-win-opensource-4.3.2-mingw.exe уже собран и работает - осталось только скачать.

Автор: =MOHAX= 29.10.07, 06:25
Есть очень классный туториал - как установить QT под MSVC:
http://qtnode.net/wiki?title=Qt4_with_Visual_Studio

Я по нему, без проблем, установил все с первого раза.

Автор: FFF1 29.10.07, 13:07
Хмм. thx... А мне человек сказал что надо отдельно все качать и собирать... Вот гад
и качал я всегда -src.zip архив а не src-mingw.zip архив...

UPD: понятно, это таже Qt, без MinGW (инсталлер его либо качает с инета, либо юзает установленый уже). Но она почему-то заработала с Эклипсом. Ура... собрался проэктик...

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)