Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.21.100.34] |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
займись мне бы, например, было бы тоже интересно про GL в Qt почитать
|
Сообщ.
#17
,
|
|
|
Ну как там продолжение? Будет?
|
Сообщ.
#18
,
|
|
|
Интересует следующее QtGL можно совместить с нативным Qt GUI? Тоесть OGL вьювер картинок например с удобным оконным интерфейсом?
|
Сообщ.
#19
,
|
|
|
Цитата Ну как там продолжение? Будет? будет, но попозже. У меня сейчас предсессия, через неделю -- сама сессия завал... Так что где-то после середины июня займусь... Цитата Интересует следующее QtGL можно совместить с нативным Qt GUI? Тоесть OGL вьювер картинок например с удобным оконным интерфейсом? конечно. смотри examples\opengl, в частности, дему box. |
Сообщ.
#20
,
|
|
|
ВСЕМ ПРИВЕТ!!!
Вотя тут кое чего написал :-)))) Это для тех, кто хочет сразу посмотреть Это для тех, кто хочет сам откомпиляться или траффик на 1 метр жалко Все сорца снабжены подробными комментариями, а если что-то не ясно, то милости просим :-)) Обращайтесь:-))) Кстати, хочу сделать следующую версию уже с ToolBars и сменой курсора, да и операций немного добавить :-))) Блин!!! Я тут в main забыл кое что добавить и теперь приложение остаётся висеть после закрытия окна.... ВОт правильная версия int main( int argc, char **argv ) { QApplication app( argc, argv ); PV_Application* aApplication = new PV_Application(); app.setMainWidget( aApplication ); aApplication->show(); return app.exec(); } |
Сообщ.
#21
,
|
|
|
с trolltech.no нельзя скачать версию Qt под GPL! ибо Троллтехи придумали свою лицензию :-)
которая запрещает продавать свои программы, использующие их библиотеку. для этого придётся-таки заплатить несколько килобаксов на коммерческую лицензию :-) |
Сообщ.
#22
,
|
|
|
Цитата deil @ 11.07.04, 14:12 с trolltech.no нельзя скачать версию Qt под GPL! ибо Троллтехи придумали свою лицензию :-) которая запрещает продавать свои программы, использующие их библиотеку. для этого придётся-таки заплатить несколько килобаксов на коммерческую лицензию :-) А ты думал? :-))) У них есть фришная версия 2.3.0 Если хочешь, то могу выслать на мыло... |
Сообщ.
#23
,
|
|
|
Раз уж это FAQ, надо писать только правду
Цитата Плюсы -- к одному сигналу можно подключить несколько слотов. Минусы -- один слот нельзя использовать для нескольких сигналов (например, для обработки группы кнопок). - К одному сигналу можно подключить сколько угодно слотов. Trolltech не гарантирует порядок их вызова, гарантируется только что вызваны будут все. Подробности можно узнать из описания работы moc или просто посмотрев moc-файлы. - К одному слоту можно подключить сколько угодно сигналов. Если я правильно понял автора - он имел в виду идентификацию объекта-отправителя в слоте. По этому поводу стоит посмотреть класс QSignalMapper. Да, еще забыли упомянуть про qt-mt - многопоточное программирование. Правда, на мой неискушенный взгляд, не слишком удобно этим пользоваться. |
Сообщ.
#24
,
|
|
|
Цитата Kutushut @ 18.10.04, 14:41 - К одному слоту можно подключить сколько угодно сигналов. Если я правильно понял автора - он имел в виду идентификацию объекта-отправителя в слоте. По этому поводу стоит посмотреть класс QSignalMapper. Да, я тут неськоль был неправ. Недавно я сам с этим столкнулся и вот как выкрутился. Я просто в теле слота спросил имя класса отправителя(если отправитель всегда один и тотже то можно завести идентификатор или сравнивать указатели) через метод: class QObject { //.... protected: const QObject * sender () //... } И уж дальше тогда с этим объектом разбираться как вам заблагорассудится :-))) |
Сообщ.
#25
,
|
|
|
Цитата Allender, 24.11.04, 15:49, 521931 Да, я тут неськоль был неправ. Недавно я сам с этим столкнулся и вот как выкрутился. Я просто в теле слота спросил имя класса отправителя(если отправитель всегда один и тотже то можно завести идентификатор или сравнивать указатели) через метод: Мне кажется стоит раскрыть эту тему поподробнее. Во-первых, всегда есть 2 варианта: 1. Нужно просто знать какой объект прислал сигнал. Классический пример - кнопки калькулятора. В этом случае нужно использовать QSignalMapper, а не строить велосипеды: 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. Нужно не только знать объект, но он еще передает значимые данные. Правда, тут стоит задуматься откуда взялось такое узкое место, в котором собираются данные от разных источников с определением источника. В любом случае 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а определяет имя класса, и выбирать нужный. |
Сообщ.
#26
,
|
|
|
Цитата Allender @ Мда... Может, я что-то не допонял - Qt - это что-то вроде perl или java? Сюдя по тому, что этот код int main( int argc, char **argv ) { QApplication app( argc, argv ); PV_Application* aApplication = new PV_Application(); app.setMainWidget( aApplication ); aApplication->show(); return app.exec(); } #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; } |
Сообщ.
#27
,
|
|
|
Adil
Что самое смешное, эта традиция от Тролтехов. Специально влез в их примеры, и вот что увидел: В новом пишут правильно: http://doc.trolltech.com/4.0/widgets-analogclock-main-cpp.html 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 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) необходимо явно вызывать деструкторы. |
Сообщ.
#28
,
|
|
|
Цитата Kutushut @ Вот перед мною лежит книжка (бумажная, 200 руб отдал) Qt 3 ... авторы: Жасмин Бланшет,Марк Саммерфилд; еще подпись есть - Официально одобренно компанией TrollTech, открываю 1 из первых глав и ...А вот в книжках по Qt деструкторы не вызывают - топором уже не порубаешь. 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(); } |
Сообщ.
#29
,
|
|
|
Сейчас вдруг усомнился - а вдруг widget удаляется в деструкторе QApplication? Все-таки указатель-то туда передается (a.setMainWidget). Проверил:
... 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; } |
Сообщ.
#30
,
|
|
|
Adil, кстати, я тоже сначала подумал, что QApplication разрулит ситуацию, ломанулся в qassistant, а там сказано, дескать, никто не будет за вас вашу работу, раз создали на куче, значит сносите объект сами.
P.S. я проверял на 3.3.3/3.3.4, интересно, что 4.0/4.0.1 думают по этому поводу? |