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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Ошибки Qt Visual Studio Integration  (Прочитано 17247 раз)
CoderInside
Гость
« : Февраль 05, 2006, 21:37 »

Здравствуйте!  Улыбающийся
Начал интересоваться Qt недавно. Скачал с сайта http://qt.tttxp.ru/ qt-win-commercial-4.1.0-vs2003.exe + qt-vsintegration-1.1.0.exe. У меня стоит VS .NET 2003. Установил, все ОК. Компилируется, собирается, вроде все нормально. Кроме одного.

Дело происходит в VS .NET 2003. Когда я хочу переместить какой нибудь виджет с панели Qt toolbox на форму - то появляется окошко с ошибкой: The following error occured: The application exited with an error (ExitCode 1). И кнопка ОК.
Вопреки сообщению  - программа не закрывается. Все продолжает работать. Если опять попробовать поместить виджет на форму - опять это же окошко с ошибкой. А вот когда нажать кнопку Сохранить - то ошибка первый раз не появляется. А потом все по прежнему :-(.

Подскажите плз. Может кто сталкивался с подобной проблемой. Просто невозможно работать с такими ошибками.
Записан
FrankS
Гость
« Ответ #1 : Февраль 06, 2006, 02:00 »

Хм... попробуй всё снести и установить заново... я тоже качал от туда - проблем нет, может дело в твоём вижуале?
Записан
Steven_Orko
Гость
« Ответ #2 : Февраль 06, 2006, 05:50 »

Цитата: "FrankS"
Хм... попробуй всё снести и установить заново... я тоже качал от туда - проблем нет, может дело в твоём вижуале?

У меня тоже была такая проблемма, когда я работал с qt-проектами, которые сгенерировал визард студии. Иногда появлялась такая ошибка, иногда нет. Но мне жизнь она не портила, потому не пытался ее устранить. Ща перешел на 2005, пока не проверял.
Хотя, помню, как-то переустанавливал систему, и в тот раз все работало без проблемм, как и у FrankS.
Записан
CoderInside
Гость
« Ответ #3 : Февраль 07, 2006, 10:30 »

В настройках VS появилась вкладка Qt. Там есть два параметра. Один (верхний) отвечает за базу для автозавершения комманд. Вот когда я с него галочку снял - ошибки пропали. Но теперь плохо работает автозавершение (ну тот механизм который показывает список переменных, функций и прочее когда после имени класса пишешь точку или ->  Подмигивающий). Как можно это устранить?
Записан
oktogen
Гость
« Ответ #4 : Февраль 11, 2006, 11:02 »

Есть решение альтернативное.
Меня этот интегратор достал своими заскоками относительно обязательности
файла ui в проекте, невозможностью нормально использовать много файлов для разных классов.
Сделано следующее:
1)  освоена технология QMake
2) Установлен QT
3) Установлен компалятор( использую вижуловский)
4) Редактор текстовый(я использую http://sourceviewer.narod.ru/)

Далее создается проект qmake ,открывается qt-консоль,
qmake
nmake
+К студии и к виндам теперь вообще не привязан
+Никаких глюков.
- не очень удобно. нет автозавершения и прочей....
Записан
Dendy
Гость
« Ответ #5 : Февраль 11, 2006, 14:52 »

Интегратор - совершенно не критическая вещь для студии. Если честно - не понимаю, как многие жалуются на его работу и не удалят.

Редактирование форм лучше делать в Дизайнере, а не в студии.
Помощь лучше читать из Асистента, а не из студии.
Помощник для отладочной информации вписьІвается руками.
Правила moc, uic, rcc прекрастно вписьІваются руками, чем автоматически. Кроме того для файлов с неизвестньІми расширениями сама студия предлагает установить правила по умолчанию.

Не спорю, интегратор - вещь нужная, но далеко не критичная. Как для меня - он ещё не дорос, чтобьІ удобства его использования превосходили недостатки.
Записан
ElderOrb
Гость
« Ответ #6 : Февраль 11, 2006, 15:35 »

А мне интегратор совершенно не мешает, я к нему уже привык. ж) Да и сёрьзных глюков я вижу только два: иногда почему-то вылетает с ошибкой (достаточно редко, поэтому не напрягает), и глюк посерьёзней - иногда портит ui-файлы, но если заиметь привычку их периодически сэйвить опять же не проблема. Думаю уже в Qt 4.1.1 его полностью доведут до ума.

Цитировать
Редактирование форм лучше делать в Дизайнере, а не в студии.
Что умеет дизайнер из того что не умеет интегратор?

Цитировать
Помощь лучше читать из Асистента, а не из студии.

По этому пункту полностью согласен.

Цитировать
Помощник для отладочной информации вписьІвается руками.
А чё эта? ж))))

Цитировать
Правила moc, uic, rcc прекрастно вписьІваются руками, чем автоматически.
О ужас ! ж) Это конечно полезно уметь, да у меня всё руки не дойдут почитать как и разобраться раз и навсегда.
Записан
oktogen
Гость
« Ответ #7 : Февраль 11, 2006, 16:08 »

Я последнюю неделю не пользуюсь вообще Ни студией ни интегратором.
Компилятор, QT  консоль, текстовый редактор, QTDesigner и асистент.
Цитировать

Да и сёрьзных глюков я вижу только два: иногда почему-то вылетает с ошибкой (достаточно редко, поэтому не напрягает), и глюк посерьёзней - иногда портит ui-файлы, но если заиметь привычку их периодически сэйвить опять же не проблема.

Кстати, в моей схеме никакой Ui шник вовсе не нужен и глюков нет! 2 магические команды и все довольны!
Записан
Dendy
Гость
« Ответ #8 : Февраль 11, 2006, 16:50 »

Цитата: "ElderOrb"
Что умеет дизайнер из того что не умеет интегратор?


Пользовался дизайнером из студии, не понравилось. Мои знакомьІе утверждают, что дизайнер в студии имеет некоторьІе недостатки (баги?), но ето должньІ исправить. Реально дизайнер - совершенно отдельная программа, просто производящая на свет ui-файльІ, с проектом форма не связана никак, поетому и воспринимать его лучше в  отдельном окне. А так получается - просто программа в программе, понту... окошко только меньше (-:

Цитировать
Помощник для отладочной информации вписьІвается руками.
 А чё эта? ж))))


Debug Extensions - правка студийного autoexp.dat, в котором прописьІваются правила как визуализировать/править типьІ при отладке. Достаточно один раз сохранить копию куска, которьІй вставляет Qt Integration при инсталяции.

Цитировать
О ужас ! ж) Это конечно полезно уметь, да у меня всё руки не дойдут почитать как и разобраться раз и навсегда.


Вот ето плохо. Почитать нужно просто для понимания как ета дурмашина Qt вообще функциклирует. Грубо говоря: для всех заголовочников/форм/ресурсов нужно прописать один и тот же Custom Build соответственно. Очень просто, копи-паст при добавлении одного из етих файлов в проект. Да и файлики можно организовать по правильньІм папочкам, временньІе файльІ - тож куда сам захотел, а не по умолчанию. Если интересно - могу написать пример.
Записан
ElderOrb
Гость
« Ответ #9 : Февраль 12, 2006, 14:50 »

Не хотел просить пример, так как думал что буду заслуженно отправлен читать доки ж). Конечно интересно, если б я раз и навсегда запомнил как всё вручную настраивается - поставил бы себе какой-нить codeblocks или ещё чё-нить опенсоурсовое и стал бы использовать опенсоурсовое Qt. Если конечно это удобно ж)
Записан
Dendy
Гость
« Ответ #10 : Февраль 13, 2006, 12:17 »

Итак, предлагаю свой способ настройки студии, претендующий на правильньІй.

1. Ставим расширения отладчика. Нужно для правильного показа в окне отладочной информации Qt-типов. ОткрьІваем файл

Common7/Packages/Debugger/autoexp.dat

и добавляем в раздел [AutoExpand] то же самое, что делает интегратор:

Код:
;QT_DEBUG_START (Qt Visual Studio Integration v1.1.0)

QString=<d->data,su> size=<d->size,u>
QByteArray=<d->data,s> size=<d->size,u>
QUrl =<d->encodedOriginal.d->data,s>
QUrlInfo =<d->name.d->data,su>
QPoint =x=<xp> y=<yp>
QPointF =x=<xp> y=<yp>
QRect =x1=<x1> y1=<y1> x2=<x2> y2=<y2>
QRectF =x=<xp> y=<yp> w=<w> h=<h>
QSize =width=<wd> height=<ht>
QSizeF =width=<wd> height=<ht>
QMap<*> =size=<d->size>
QVector<*> =size=<d->size>
QHash<*> =size=<d->size>
QVarLengthArray<*> =size=<s> data=<ptr>
QFont =family=<d->request.family.d->data,su> size=<d->request.pointSize, f>
QDomNode =name=<impl->name.d->data,su> value=<impl->value.d->data,su>


QFile=$ADDIN(Qt4EEAddin.dll,_Qt4EEAddIn_QFile@28)
QDir=$ADDIN(Qt4EEAddin.dll,_Qt4EEAddIn_QDir@28)
QFileInfo=$ADDIN(Qt4EEAddin.dll,_Qt4EEAddIn_QFileInfo@28)
QList<*>=$ADDIN(Qt4EEAddin.dll,_Qt4EEAddIn_QList@28)
QVariant=$ADDIN(Qt4EEAddin.dll,_Qt4EEAddIn_QVariant@28)
QEvent=$ADDIN(Qt4EEAddin.dll,_Qt4EEAddIn_QEvent@28)
QObject=$ADDIN(Qt4EEAddin.dll,_Qt4EEAddIn_QObject@28)
QLibrary=$ADDIN(Qt4EEAddin.dll,_Qt4EEAddIn_QLibrary@28)

;QT_DEBUG_END


2. Добавляем по желанию подсветку синтаксиса ключевьІх Qt-фраз. Создаём (или открьІваем) файл Common7/IDE/usertype.dat и вписьІваем:

Код:
Q_OBJECT
Q_ENUMS
Q_FLAGS
Q_INTERFACES
Q_PROPERTY
Q_SETS
Q_CLASSINFO
emit
SIGNAL
SLOT
signals:
slots:
qobject_cast
qvariant_cast


3. Настраиваем директории студии. Options/Projects and Solutions/VC++ Directories:

Include files:
Код:
$(qtdir)/include
$(qtdir)/include/QtCore
$(qtdir)/include/QtGui
$(qtdir)/include/QtXml
$(qtdir)/include/QtNetwork
$(qtdir)/include/QtOpenGL
$(qtdir)/include/QtSql
// по желанию, но, в большинстве случаев, не обязательно:
$(qtdir)/include/QtTest
$(qtdir)/include/QtAssistant
$(qtdir)/include/QtDesigner
$(qtdir)/include/Qt3Support
$(qtdir)/include/ActiveQt
// полезньІе сторонние либьІ лежат в src/3rdparty:
$(qtdir)/src/3rdparty/zlib
$(qtdir)/src/3rdparty/freetype


Library files:
Код:
$(qtdir)/lib


Конфликтов не будет. Кто хочет - может задать абсолютньІе пути вместо переменной $(qtdir).

Добавляя файльІ в проект мьІ должньІ прописьІвать правило, что с ним нужно делать. Например, для cpp-файлов студия автоматически ставит правило: компилировать как C/C++ код. Не стоит забьІвать, что правила можно устанавливать сразу для нескольких файлов, вьІделив их через Control. Далее - Properties/CustomBuild Step.

4. При добавлении в проект заголовочника, для которого нужно создать мета-информацию прописьІваем 3 строчки соответственно:

Код:
$(qtdir)/bin/moc.exe -I"$(qtdir)/include" $(InputDir)$(InputFileName) -o _tmp/moc_$(InputName).cpp
MOC'ing $(InputFileName) ...
_tmp/moc_$(InputName).cpp


Здесь можно вьІтворять всё что вздумается. Мне вот нравится создавать мета-информацию в папке _tmp с префиксом moc_.

СгенерированньІй файл нужно будет добавить в проект руками или прописать в коде:

Код:
#include "moc_mycoolclass.cpp"


(Иногда последний вариант предпочтительней, если используются Precompiled Headers.)

5. При добавлении формьІ, ui-файла в проект прописьІваем ему следующее:

Код:
$(qtdir)/bin/uic.exe $(InputDir)$(InputFileName) -o _tmp/ui_$(InputName).h
UIC'ing $(InputFileName) ...
_tmp/ui_$(InputName).h


Здесь опять же хоть конём танцуем. Предпочитаю создавать формьІ в той же временной папке в префиксом ui_. СгенерированньІй заголовочник включать в прект не нужно, ибо он инклудится в ком-нить cpp-файле, реализующем форму.

6. При добавлении ресурса, qrc-файла прописьІваем следующее:

Код:
$(qtdir)/bin/rcc.exe -name $(InputName) $(InputDir)$(InputFileName) -o _tmp/qrc_$(InputName).cpp
RCC'ing $(InputFileName) ...
_tmp/qrc_$(InputName).cpp


Результат добавляем в проект.

7. Ещё один екзотический способ прекомпиляции - из cpp-файла, когда тип описьІвается в самом cpp-файле. В етом случае после обьявления типа обязано следовать:

#include "mycoolclass.moc"

Не рекомендуется повторять в домашних условиях. У студии проблемьІ с пересозданием файла, которьІй должен генерировать сам себя, ибо она проверяет по дате последнего изменения. Но на всяк пожарньІй вот код при добавлении в проект moc-файла:

Код:
$(qtdir)/bin/moc.exe -I"$(qtdir)/include" $(InputDir)$(InputName).cpp -o _tmp/$(InputName).moc
MOC'ing $(InputName).cpp ...
_tmp/$(InputName).moc


8. Мелочи.

В дополнительньІе директории инклудов проекта не забудьте добавить:

Код:
_tmp


или любое другое название временной папке, что вьІберите.

В список либ теперь можно добавлять необходимьІе, к примеру:

Код:
qtmaind.lib QtCored4.lib QtGuid4.lib QtXmld4.lib


Вроде ничего не забьІл. Ничего сложного. Советую всем попробовать.
Записан
Taimas
Гость
« Ответ #11 : Март 18, 2006, 00:34 »

Здравствуйте, я тоже новичок в Qt.
CoderInside, у меня тоже qt-commercial-4.1.0+qt-vsintegration-1.1.0 и Visual Studio.NET 2003. Поначалу была такая же проблема с размещением виджетов на форму. Тогда я по умолчанию создавал проекты в MyDocuments/Visual Studio Projects и получал такие же ошибки. Потом попобовал создать проект в папке где я установил сам Qt (C:/Qt/QProjects), и все было нормально.
У меня такая проблема: не могу понять как создавать свои собственные слоты. Если вмешаться в ui.h файл, то затем постоянно напоминает о том что он изменен, и это очень раздражает. Неужели нет штатного метода для этой цели, ведь в Qt3 Desiner все очень понятно.
Записан
Steven_Orko
Гость
« Ответ #12 : Март 18, 2006, 12:43 »

Цитата: "Taimas"
Здравствуйте, я тоже новичок в Qt.
У меня такая проблема: не могу понять как создавать свои собственные слоты. Если вмешаться в ui.h файл, то затем постоянно напоминает о том что он изменен, и это очень раздражает. Неужели нет штатного метода для этой цели, ведь в Qt3 Desiner все очень понятно.


Эта проблемма на форуме уже обсуждалась не раз. И инициатором, вернее, тем, кто первый об этом рассказал, был Dendy.
В Qt Designer НЕЛЬЗЯ создавать свои слоты. и это правильно. Потому что это ознает "влезть в код". Свои слоты надо создавать в классе, который наследуется от класса, описанного в *.ui и находящегося в заголовочном файле ui_<имя файла формы>.h. Этот файл инклюдится в твой потомок.

Слоты создаются простым объявлением в интерфейсе класса после так называемых ключевых слов прав доступа: public slots, protected slots, private slots. Слоты не могут возвращать значение, не могут иметь агрументов по-умолчанию. Подробнее см. Qt Assistant.
Записан
Dendy
Гость
« Ответ #13 : Март 20, 2006, 11:28 »

СгенерированньІй дизайнером .ui файл содержит просто контейнер для елементов управления, их свойств, трансляций. Всё ето можно разместить на любом окне, совершенно не обязательно наследоваться для создания нового типа окна. Лично я предпочитаю Ui_ класс создавать динамически, чтобьІ не включать его в заголовочник, хотя в етом есть свои минусьІ.

2 Steven_Orko
Хочу поправить. СлотьІ могут возвращать значения и могут иметь аргументьІ по умолчанию. При етом коннектить к ним можно сигнальІ с произвольньІм колличеством параметром >= количеству параметров слота, которьІе не по умолчанию.
Записан
Steven_Orko
Гость
« Ответ #14 : Март 21, 2006, 00:30 »

Цитата: "Dendy"

2 Steven_Orko
Хочу поправить. СлотьІ могут возвращать значения и могут иметь аргументьІ по умолчанию. При етом коннектить к ним можно сигнальІ с произвольньІм колличеством параметром >= количеству параметров слота, которьІе не по умолчанию.


2 Dendy:
Выписка из Assistant:
Цитировать
Slots
A slot is called when a signal connected to it is emitted. Slots are normal C++ functions and can be called normally; their only special feature is that signals can be connected to them. A slot's arguments cannot have default values, and, like signals, it is rarely wise to use your own custom types for slot arguments.
Since slots are normal member functions with just a little extra spice, they have access rights like ordinary member functions. A slot's access right determines who can connect to it:
A public slots section contains slots that anyone can connect signals to. This is very useful for component programming: you create objects that know nothing about each other, connect their signals and slots so that information is passed correctly, and, like a model railway, turn it on and leave it running.
A protected slots section contains slots that this class and its subclasses may connect signals to. This is intended for slots that are part of the class's implementation rather than its interface to the rest of the world.
A private slots section contains slots that only the class itself may connect signals to. This is intended for very tightly connected classes, where even subclasses aren't trusted to get the connections right.
You can also define slots to be virtual, which we have found quite useful in practice.
Compared to callbacks, signals and slots are slightly slower because of the increased flexibility they provide, although the difference for real applications is insignificant. In general, emitting a signal that is connected to some slots, is approximately ten times slower than calling the receivers directly, with non-virtual function calls. This is the overhead required to locate the connection object, to safely iterate over all connections (i.e. checking that subsequent receivers have not been destroyed during the emission), and to marshall any parameters in a generic fashion. While ten non-virtual function calls may sound like a lot, it's much less overhead than any new or delete operation, for example. As soon as you perform a string, vector or list operation that behind the scene requires new or delete, the signals and slots overhead is only responsible for a very small proportion of the complete function call costs.
The same is true whenever you do a system call in a slot; or indirectly call more than ten functions. On an i586-500, you can emit around 2,000,000 signals per second connected to one receiver, or around 1,200,000 per second connected to two receivers. The simplicity and flexibility of the signals and slots mechanism is well worth the overhead, which your users won't even notice.
Note that other libraries that define variables called signals or slots may cause compiler warnings and errors when compiled alongside a Qt-based application. To solve this problem, #undef the offending preprocessor symbol.


Конечно, в этой части сказано только про значение по-умолчанию, но я в другом месте читал и про тип возвращаемого значения.

P.S. Qt 4.1.1
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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