На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела FAQ в группе разделов С++.
1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.
Модераторы: B.V., Qraizer
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Что такое QT и с чем его едят ? , Наконец-то я созрел для статьи:-))
    займись :) мне бы, например, было бы тоже интересно про GL в Qt почитать :)
      Ну как там продолжение? Будет?:)
        Интересует следующее QtGL можно совместить с нативным Qt GUI? Тоесть OGL вьювер картинок например с удобным оконным интерфейсом?
          Цитата
          Ну как там продолжение? Будет?


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

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


          конечно. смотри examples\opengl, в частности, дему box.
            ВСЕМ ПРИВЕТ!!!
            Вотя тут кое чего написал :-))))
            Это для тех, кто хочет сразу посмотреть
            Это для тех, кто хочет сам откомпиляться или траффик на 1 метр жалко

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

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

            Блин!!! Я тут в main забыл кое что добавить и теперь приложение остаётся висеть после закрытия окна....
            ВОт правильная версия
            ExpandedWrap disabled
               
              int main( int argc, char **argv )
              {
                  QApplication app( argc, argv );
                  
                  PV_Application* aApplication = new PV_Application();
                  app.setMainWidget( aApplication );
                  aApplication->show();
               
                  return app.exec();
              }
            Сообщение отредактировано: Allender -
              с trolltech.no нельзя скачать версию Qt под GPL! ибо Троллтехи придумали свою лицензию :-)
              которая запрещает продавать свои программы, использующие их библиотеку. для этого придётся-таки заплатить несколько килобаксов на коммерческую лицензию :-)
                Цитата deil @ 11.07.04, 14:12
                с trolltech.no нельзя скачать версию Qt под GPL! ибо Троллтехи придумали свою лицензию :-)
                которая запрещает продавать свои программы, использующие их библиотеку. для этого придётся-таки заплатить несколько килобаксов на коммерческую лицензию :-)

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

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


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

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

                  Да, еще забыли упомянуть про qt-mt - многопоточное программирование. Правда, на мой неискушенный взгляд, не слишком удобно этим пользоваться.
                    Цитата Kutushut @ 18.10.04, 14:41
                    - К одному слоту можно подключить сколько угодно сигналов.
                    Если я правильно понял автора - он имел в виду идентификацию объекта-отправителя в слоте. По этому поводу стоит посмотреть класс QSignalMapper.

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


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


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

                      Во-первых, всегда есть 2 варианта:
                      1. Нужно просто знать какой объект прислал сигнал. Классический пример - кнопки калькулятора. В этом случае нужно использовать QSignalMapper, а не строить велосипеды:
                      ExpandedWrap disabled
                        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. Нужно не только знать объект, но он еще передает значимые данные. Правда, тут стоит задуматься откуда взялось такое узкое место, в котором собираются данные от разных источников с определением источника.
                      В любом случае
                      ExpandedWrap disabled
                        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а определяет имя класса, и выбирать нужный.
                        Цитата Allender @
                        ExpandedWrap disabled
                          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? ;) Сюдя по тому, что этот код
                        ExpandedWrap disabled
                          #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;
                          }
                        работает на "ура" - это все-таки С: кто память-то за собой подчищать будет?
                          Adil
                          Что самое смешное, эта традиция от Тролтехов. Специально влез в их примеры, и вот что увидел:

                          В новом пишут правильно:
                          http://doc.trolltech.com/4.0/widgets-analogclock-main-cpp.html
                          ExpandedWrap disabled
                                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
                          ExpandedWrap disabled
                            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) необходимо явно вызывать деструкторы.

                          ;)
                            Цитата Kutushut @
                            А вот в книжках по Qt деструкторы не вызывают - топором уже не порубаешь.
                            Вот перед мною лежит книжка (бумажная, 200 руб отдал) Qt 3 ... авторы: Жасмин Бланшет,Марк Саммерфилд; еще подпись есть - Официально одобренно компанией TrollTech, открываю 1 из первых глав и ...
                            ExpandedWrap disabled
                              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:
                              Сейчас вдруг усомнился - а вдруг widget удаляется в деструкторе QApplication? Все-таки указатель-то туда передается (a.setMainWidget). Проверил:
                              ExpandedWrap disabled
                                ...
                                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++.
                                Adil, кстати, я тоже сначала подумал, что QApplication разрулит ситуацию, ломанулся в qassistant, а там сказано, дескать, никто не будет за вас вашу работу, раз создали на куче, значит сносите объект сами.

                                P.S. я проверял на 3.3.3/3.3.4, интересно, что 4.0/4.0.1 думают по этому поводу?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0507 ]   [ 15 queries used ]   [ Generated: 1.05.24, 18:42 GMT ]