QT4 + Visual Studio 2010 (сборка приложения)
Внимание! Этот документ ещё не опубликован.
Автор: VDragon
QT 4.7 + Visual Studio 2010
Немного о том, как я заставил работать код с использованием библиотек QT от NOKIA в связке с Visual Studio 2010.
QT – объектно ориентированная кроссплатформеная библиотека для создания интерфейса, настолько крутая, что ее используют такие софтины как фотошоп, опера а идет она даже на макосах. По заявлениям авторов мануалов, QT настолько крута и проста, что MFC нервно курит в сторонке. При всей своей простоте, авторам QT не хватило стандартных средств C++ и они его расширили…
Прочитав в интернетах и книгах о QT я решил оценить зверя на практике. Пишу код я обычно в Visual Studio 2010, так как нравится он мне своими удобствами, и отказываться от сей порочной практики из за QT я посчитал глупым =) поэтому решил, во что бы то не стало заставить работать их вместе.
Скачал с http://qt.nokia.com/downloads/downloads#lgpl версию для Qt libraries 4.7.1 for Windows (VS 2008, 228 MB) и qt-vs-addin-1.1.7.exe (57 MB) (как показал практика, аддон можно не качать)
Поставил либы, аддон для студии узнал мою 10ку, и установился без проблем.
При создании проекта появилась вкладка QT и варианты приложений, из которых я выбрал «приложение QT, или чтото типа того, уже не помню» =)
НУ НЕ МОЖЕТ В ЭТОЙ ЖИЗНИ ВСЕ БЫТЬ ТАК ПРОСТО !!!
Незнаю почему, но дефолтное приложение у меня не собралось, не собрался и консольный вариант. Аддон пришлось «казнить, нельзя помиловать» (так что можете их просто не качать)
Решил пойти стандартным путем и получил следующий рецепт
1. Убеждаемся в наличии установленных у вас 2008 (и выше) визуальной студии и библиотек QT для VS2008 и выше. Также прописываем папку c:\QT\4.7.1\bin в Path.
2. Создаем пустой проект консольный или General. Добавляем туда main.cpp, идем в настройки проекта (Project Properties (Alt+F7) ), убеждаемся, что сверху у нас выбрано All Configurations
в Configuration Properties\C/C++\General\Additional Include Directory и добавляем путь к заголовкам библиотек QT (C:\Qt\4.7.1\include)
в Configuration Properties\Linker\General\Additional Library Directory добавляем путь к библиотечным файлам QT (C:\Qt\4.7.1\lib)
и теперь финт ушами, в Configuration Properties\Build Events\Pre-Build Event\Command Line добавляем следующее moc -o main.cpp main.moc
Для QT больше ничего настраивать ненадо, можно сохранятся и выходить.
А теперь внимание, это важно. Как я уже писал выше, QT настолько крут, что ему не хватило стандартных средств языка С++ и авторы дерзновенно расширили сковывающие их рамки языка. Сделали они это путем введения хитрых макросов для описания QT объектов и некоторых их свойств, например слоты и сигналы. Простая программа использующая уже готовые класс элементов QT будет работать нормально, но только мы захотим создать класс в котором опишем наш сигнал или слот, средств С++ станет недостаточно и компилятор выдаст ошибку.
Для того, чтобы код принял завершенную форму, нам потребуется так называемый мета обжект компилер (moc) входящий в состав SDK от QT, (лежит он в папке C:\QT\4.7.1\bin\moc.exe и, как я говорил выше, на эту папку желательно прописать PATH’ы, а то система его не найдет) После того как moc переварит ваш код он создаст файл с недостающим кодом который вам нужно будет включить в ваш проект.
В нашем случае это будет файл main.moc, именно его мы создаем вызывая в Pre Build – moc -o main.moc main.cpp
Ну, и на сладкое, немного кода в котором есть класс с описанным слотом печатающий в консоль Hello world =)
#include <QtCore\QtCore> #include <QtGui\QtGui> #pragma comment(lib, "QtGui4.lib") #pragma comment( lib, "QtCore4.lib") //вот он, расширенный QT класс с макросом Q_OBJECT и public slots class MyButton : public QPushButton{ Q_OBJECT public: MyButton( QWidget *parent):QPushButton( parent){ connect( this, SIGNAL( clicked( )), this, SLOT( onClicked( ))); this->setText( "Кнопка"); } public slots: void onClicked( ){ printf( "hello world \n"); } }; int main( int argc, char *argv[]){ QApplication app( argc,argv); //а вот так в QT решается проблема кирилицы на элементах интерфейса =) QTextCodec::setCodecForCStrings( QTextCodec::codecForName( "CP1251")); QWidget window; window.resize( 200,100); QVBoxLayout *lo = new QVBoxLayout( ); MyButton *b = new MyButton( 0); lo->addWidget( b); window.setLayout( lo); window.show( ); return app.exec( ); } #include "main.moc" // <--недостающее, полученное методом метокомпиляции moc
P.S. нечто похожее описывается в книге Макса Шлее – Qt 4.5. Профессиональное программирование на C++ (кстати рекомендую) но почему-то на 66 странице X_x, я не настолько терпилив =)
Также замечу, в QT библиотеки разбиты на части и инклудить их приходится так <QtGui\QtGui> а не просто <QtGui>
#Qt, #Qt4, #Visual Studio 2010
20 января 2011
Комментарии [7]