Статьи

QT4 + Visual Studio 2010 (сборка приложения)

Внимание! Этот документ ещё не опубликован.

Автор:

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]