Название: Проблемы после перехода на VisualStudio.
Отправлено: gueRRero от Март 26, 2009, 09:45
Ситуация следующая. Я писал под QtCreator. По определенным причинам пришлось перейти под VisualStudio. После определенных мучений с компиляцией Qt под Студию, собрал старый проект и запустил. Запустился он нормально, но вот при обращении к меню (неважно к какому - у меня на форме 2 менюшки и контекстное меню в трее) прога падает. Причем действия из меню при их вызове с клавиатуры работают адекватно. Debugger при падении выдает сообщение: Unhandled exception at 0x6506b8e6 (QtGuid4.dll) in MyPro.exe: 0xC0000005: Access violation reading location 0x000000d7. И отсылает меня к строчке из файла qglobal.h: inline QFlags operator&(Enum f) const { QFlags g; g.i = i & f; return g; } Помогите, пожалуйста, решить эту прблему.
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: pastor от Март 26, 2009, 10:01
Покажи полный стек вызовов
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: gueRRero от Март 26, 2009, 10:11
Если я правильно понял, то вот: > QtGuid4.dll!QFlags<enum Qt::WindowType>::operator&(Qt::WindowType f=WindowType_Mask) Line 2004 + 0x16 bytes C++ QtGuid4.dll!QWidget::windowType() Line 890 + 0x20 bytes C++ QtGuid4.dll!QApplication::desktop() Line 3041 + 0x14 bytes C++ QtGuid4.dll!QMenuPrivate::calcActionRects(QMap<QAction *,QRect> & actionRects=[0](), QList<QAction *> & actionList=[0]()) Line 209 + 0x9 bytes C++ QtGuid4.dll!QMenuPrivate::updateActions() Line 329 C++ QtGuid4.dll!QMenu::popup(const QPoint & p={...}, QAction * atAction=0x00000000) Line 1790 C++ QtGuid4.dll!QSystemTrayIconSys::winEvent(tagMSG * m=0x0012dd38, long * result=0x0012dd5c) Line 473 C++ QtGuid4.dll!QtWndProc(HWND__ * hwnd=0x00170b4e, unsigned int message=32869, unsigned int wParam=0, long lParam=517) Line 1662 + 0x18 bytes C++ user32.dll!77d38709() [Frames below may be incorrect and/or missing, no symbols loaded for user32.dll] user32.dll!77d387eb() msvcr90d.dll!_unlock(int locknum=2010351624) Line 376 C user32.dll!77d60494() user32.dll!77d39385() user32.dll!77d393df() QtCored4.dll!winPeekMessage(tagMSG * msg=0x0012dfc4, HWND__ * hWnd=0x00000000, unsigned int wMsgFilterMin=0, unsigned int wMsgFilterMax=0, unsigned int wRemoveMsg=1) Line 390 + 0x24 bytes C++ QtCored4.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...}) Line 700 + 0x14 bytes C++ QtGuid4.dll!QGuiEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...}) Line 1182 + 0x15 bytes C++ QtCored4.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...}) Line 150 C++ QtCored4.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...}) Line 200 + 0x2d bytes C++ QtCored4.dll!QCoreApplication::exec() Line 880 + 0x15 bytes C++ QtGuid4.dll!QApplication::exec() Line 3554 C++ MyPro.exe!main(int argc=1, char * * argv=0x003a83e8) Line 17 + 0x6 bytes C++ MyPro.exe!WinMain(HINSTANCE__ * instance=0x00400000, HINSTANCE__ * prevInstance=0x00000000, char * __formal=0x00151f0a, int cmdShow=1) Line 136 + 0x12 bytes C++ MyPro.exe!__tmainCRTStartup() Line 574 + 0x35 bytes C MyPro.exe!WinMainCRTStartup() Line 399 C kernel32.dll!7c816d4f() kernel32.dll!7c8399f3()
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: gueRRero от Март 26, 2009, 22:05
Обнаружилось, что ошибка возникает не всегда (вернее, в трее - всегда, а в меню - не всегда). При некоторых запусках программа работает более-менее нормально, но в большинстве случаев все-таки падает... Кстати, вместе с указанной ошибкой, еще выдает: First-chance exception at 0x6506b8e6 (QtGuid4.dll) in MyPro.exe: 0xC0000005: Access violation reading location 0xfeeefef6.
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: pastor от Март 26, 2009, 22:14
А есть возможность выложить программу? Или хотябы минимальный компилябельный код ля воспроизведения краша?
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: gueRRero от Март 27, 2009, 09:50
Проект состоит из 4 файлов: main.cpp, MainWindow.h, MainWindow.cpp, MainWindow.ui. Файл main.cpp (Подозреваю, что проблема в нем): #include <QtGui/QApplication> #include "mainwindow.h" #include <QDesktopWidget>
int main(int argc, char *argv[]) { QApplication a(argc, argv); QDesktopWidget *scr = QApplication::desktop(); int scrWidth = scr->screen(0)->width(); int scrHeight = scr->screen(0)->height(); MainWindow Window(scrWidth, scrHeight); delete scr; return a.exec(); } Файл MainWindow.h: #ifndef MAINWINDOW_H #define MAINWINDOW_H
#include "ui_MainWindow.h" #include <QMessageBox> #include <QSystemTrayIcon> #include <QSettings>
class MainWindow : public QMainWindow, public Ui::MainWindow { Q_OBJECT
private: int scrWidth; int scrHeight; QAction showAction; QAction hideAction; QSystemTrayIcon* Tray; QMenu TrayMenu; QSettings* settings;
protected: void closeEvent(QCloseEvent *event);
public: MainWindow(int deskWidth, int deskHeight, QMainWindow* pwgt = 0);
public slots: void ShowMainWindowSlot(); void iconActivated(QSystemTrayIcon::ActivationReason reason); void CreateMenu(); void CreateTray(); void QuitSlot(); }; #endif // MAINWINDOW_H Файл MainWindow.cpp #include "MainWindow.h" #include <QCloseEvent> #include <QMenu>
//----------------------------------------------------------------------------------
MainWindow::MainWindow(int deskWidth, int deskHeight,QMainWindow* pwgt): QMainWindow(pwgt), scrWidth(deskWidth), scrHeight(deskHeight), showAction(tr("Show Main Window"), this), hideAction(tr("Hide Main Window"), this) { setupUi(this);
CreateMenu(); CreateTray();
connect(Tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); statusbar->showMessage(tr("Welcome to MyPro!")); this->show(); }
//---------------------------------------------------------------------------------- //----------------------------------EVENTS------------------------------------------ //----------------------------------------------------------------------------------
void MainWindow::closeEvent(QCloseEvent *event) { TrayMenu.removeAction(&hideAction); TrayMenu.removeAction(actionQuit); TrayMenu.addAction(&showAction); TrayMenu.addAction(actionQuit); Tray->setContextMenu(&TrayMenu); hide(); event->ignore(); }
//---------------------------------------------------------------------------------- //----------------------------------SLOTS------------------------------------------- //----------------------------------------------------------------------------------
void MainWindow::ShowMainWindowSlot() { TrayMenu.removeAction(&showAction); TrayMenu.removeAction(actionQuit); TrayMenu.addAction(&hideAction); TrayMenu.addAction(actionQuit); Tray->setContextMenu(&TrayMenu); show(); }
//-----------------------------------------------------------------------------------
void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: { if (this->isHidden()) this->ShowMainWindowSlot(); else this->close(); } break; default: ; } }
//----------------------------------------------------------------------------------
void MainWindow::CreateMenu() {
actionConnect->setStatusTip(tr("Click to connect"));
actionDisconnect->setStatusTip(tr("Click to disconnect"));
actionSettings->setStatusTip(tr("Click to settings"));
connect(actionQuit, SIGNAL(triggered()), SLOT(QuitSlot())); actionQuit->setStatusTip(tr("Click to quit"));
actionHelp->setStatusTip(tr("Click to read help"));
actionUpdate->setStatusTip(tr("Click to update"));
connect(actionAbout_Us, SIGNAL(triggered()), SLOT(AboutSlot())); actionAbout_Us->setStatusTip(tr("Click to read information about us"));
}
//----------------------------------------------------------------------------------
void MainWindow::CreateTray() {
Tray = new QSystemTrayIcon(); connect(&showAction, SIGNAL(triggered()), this, SLOT(ShowMainWindowSlot())); connect(&hideAction, SIGNAL(triggered()), this, SLOT(close())); TrayMenu.addAction(&hideAction); TrayMenu.addAction(actionQuit); Tray->setContextMenu(&TrayMenu); Tray->setToolTip("MyPro"); Tray->show(); }
//----------------------------------------------------------------------------------
void MainWindow::QuitSlot() { Tray->hide(); qApp->quit(); }
//---------------------------------------------------------------------------------- Содержимое файла MainWindow.ui, открытого блокнотом: <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="enabled"> <bool>true</bool> </property> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>600</height> </rect> </property> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>190</width> <height>220</height> </size> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <property name="windowIcon"> <iconset> <normaloff>../images/UmProIcon.png</normaloff>../images/UmProIcon.png</iconset> </property> <property name="locale"> <locale language="English" country="UnitedStates"/> </property> <widget class="QWidget" name="widget"> <property name="enabled"> <bool>true</bool> </property> <layout class="QGridLayout" name="gridLayout"/> </widget> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>19</height> </rect> </property> <property name="defaultUp"> <bool>false</bool> </property> <widget class="QMenu" name="menuMenu"> <property name="locale"> <locale language="English" country="UnitedStates"/> </property> <property name="title"> <string>Menu</string> </property> <property name="separatorsCollapsible"> <bool>true</bool> </property> <addaction name="actionConnect"/> <addaction name="actionDisconnect"/> <addaction name="separator"/> <addaction name="separator"/> <addaction name="separator"/> <addaction name="actionSettings"/> <addaction name="separator"/> <addaction name="actionQuit"/> </widget> <widget class="QMenu" name="menuHelp"> <property name="locale"> <locale language="English" country="UnitedStates"/> </property> <property name="title"> <string>Help</string> </property> <addaction name="actionHelp"/> <addaction name="separator"/> <addaction name="actionUpdate"/> <addaction name="actionAbout_Us"/> </widget> <addaction name="menuMenu"/> <addaction name="menuHelp"/> </widget> <widget class="QStatusBar" name="statusbar"> <property name="autoFillBackground"> <bool>false</bool> </property> </widget> <action name="actionConnect"> <property name="text"> <string>Connect...</string> </property> <property name="shortcut"> <string>Ctrl+C</string> </property> <property name="iconVisibleInMenu"> <bool>true</bool> </property> </action> <action name="actionDisconnect"> <property name="text"> <string>Disconnect...</string> </property> <property name="shortcut"> <string>Ctrl+D</string> </property> </action> <action name="actionEditLists"> <property name="text"> <string>Edit Lists...</string> </property> <property name="shortcut"> <string>Ctrl+E</string> </property> </action> <action name="actionAbout_Us"> <property name="text"> <string>About Us...</string> </property> </action> <action name="actionUpdate"> <property name="text"> <string>Update</string> </property> </action> <action name="actionChange_Password"> <property name="text"> <string>Change Password...</string> </property> <property name="shortcut"> <string>Ctrl+P</string> </property> </action> <action name="actionQuit"> <property name="text"> <string>Quit</string> </property> <property name="iconText"> <string>Quit</string> </property> <property name="shortcut"> <string>Ctrl+Q</string> </property> </action> <action name="actionHelp"> <property name="text"> <string>Help</string> </property> <property name="shortcut"> <string>F1</string> </property> </action> <action name="actionSettings"> <property name="text"> <string>Settings...</string> </property> <property name="shortcut"> <string>Ctrl+S</string> </property> </action> </widget> <resources/> <connections/> </ui>
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: gueRRero от Март 27, 2009, 09:52
Кстати, буду очень благодарен, если вы оставите свои комментарии по поводу моего кода.
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: BRE от Март 27, 2009, 10:00
Кстати, буду очень благодарен, если вы оставите свои комментарии по поводу моего кода.
Беглый просмотр. Сильно меня смущает в main.cpp: C++ (Qt) delete scr;
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: Rcus от Март 27, 2009, 10:01
- Ты убил его! - Простите, учитель.(с) Star Wars Чем вам QDesktopWidget мешал? Вы же его не создавали :) проверил на MinGW под отладчиком, без этой строки нормально работает все.
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: gueRRero от Март 27, 2009, 10:15
Спасибо огромное за оперативную помощь. Помогло. А то я уже с ног сбился искать ошибку... Кстати, может кто-нибудь расскажет, почему в QtCreatore этот код нормально работал, а в Студии не стал? Особенности компилятора? Было бы очень интересно.
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: Rcus от Март 27, 2009, 10:17
Что же до кода: - лучше использовать не screen()->geometry(), а QDesktopWidget::availableGeometry, чтобы учитывать панель задач в Windows, док в MacOS X и панели плазмы(?) в KDE. - можно присвоить Tray родителя в конструкторе (иначе когда начинаешь искать утечки памяти это будет мешать). - можно не усложнять конструктор, и вообще не хранить то что можно вычислить (scrWidth, scrHeight). - Tray->setContextMenu(&TrayMenu); можно наверно не вызывать несколько раз, да действия не удалять из меню, а использовать QAction::setVisible(). - ну и statusTip можно в ui назначать
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: Rcus от Март 27, 2009, 10:19
Кстати, может кто-нибудь расскажет, почему в QtCreatore этот код нормально работал, а в Студии не стал? Особенности компилятора? Было бы очень интересно.
WinXP, Qt SDK 2009.01. Тоже работало пока под отладчиком не запустил.
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: gueRRero от Март 27, 2009, 10:28
WinXP, Qt SDK 2009.01. Тоже работало пока под отладчиком не запустил.
Скажи пожалуйста, где можно про работу отладчиком под Qt SDK 2009.01 почитать. А то я так с ним и не разобрался. Это и стало одной из причин перехода под Студию.
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: Rcus от Март 27, 2009, 10:40
А в чем именно проблема? Trace, брейкпоинты, watch c распознаванием Qt классов, call stack... Вроде все есть.
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: gueRRero от Март 27, 2009, 10:48
Проблема в том, как все это использовать. Повесил я там брейкпоинты, нажал Debugging и ничего не произошло... Программа запускалась как обычно, нигде не сработал ни один брейкпоинт. Я скорее всего что-то не так делал, поэтому и хотелось бы где-нибудь почитать про отладчик.
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: Rcus от Март 27, 2009, 10:51
Ну обычно такое происходит когда программа собрана в релизе без отладочных символов.
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: PPrima от Март 29, 2009, 13:02
Перешел недавно на студию, возникло несколько проблем. Они не критичны, но работать мешают. Во первых, я не могу добавлять к проекту студии класс, наследованый от QObject с макросом Q_OBJECT. Выбрасывает несколько unresolved external-ов. Единственный выход - создать qmake-ом заново файл pro и из него опять таки заново,проект студии. Достаточно геморно, может есть какой-либо другой способ? Во вторых, автодополнение после . и -> срабатывает далеко не всегда, даже больше, в большинстве случаев все методы приходится набирать в ручную. И это порядком раздражает, ведь в 21 веке живем! При чем сама студия не сообщает о каких-либо ошибках, просто задумывается на долю секунды и потом в строке состояния написано ready. Контрол-пробел эффекта также не дает. Студия- 2008 експресс
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: lit-uriy от Март 29, 2009, 13:47
2 PPrima, в комерческой версии есть интегратор, он должен позволять создавать файлы и управлять moc-ом. посмотри на странице загрузок (http://www.qtsoftware.com/downloads) Visual Studio Add-in (в низу страницы). Может этот инструмент решит проблему.
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: PPrima от Март 29, 2009, 17:56
В том-то и проблема, у меня открытая версия, интегратор мне не светит. Я бы его уже давно скчал
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: lit-uriy от Март 29, 2009, 17:59
я тебе не про интегратор, а про Add-in, он свободно скачивается
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: PPrima от Март 29, 2009, 19:16
Он не ставится на експресс-версию студии. Увы.
Название: Re: Проблемы после перехода на VisualStudio.
Отправлено: Hellraiser от Март 29, 2009, 21:15
Для связки Visual Studio 2005 Express и Qt 3.3.8 написал Custom Build Rules (задается для проекта через Project -> Custom Build Rules...) для .ui и .h. Желающие могут допилить для других версий.
|