Russian Qt Forum

Qt => Вопросы новичков => Тема начата: stud от Март 02, 2015, 19:12



Название: Прошу помочь
Отправлено: stud от Март 02, 2015, 19:12
Коллеги, день добрый.
Сам на С++ не пишу, но вот подкинули задачу на плюсах с QT, приходится разбираться.
Задача простая, скачать файлы на диск из сети. (нашел кучу примеров, в том числе и на русском, но не понимаю пары вещей).

Хидер
Код:
class Test_class
{
public:
Test_class::Test_class();
~Test_class(void);
};

cpp файл
Код:
Test_class::Test_class()
{
qDebug() << "into constructor Test_class";

QNetworkAccessManager *netman = new QNetworkAccessManager();

QObject::connect(netman, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));

QNetworkReply* reply = netman->get(QNetworkRequest(QUrl("http://www.ya.ru")));

qDebug() << reply;
}

Ругается на строчку, QObject::connect(netman, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));
Вопросов 2:
1. Откуда брать QObject
2. Что в данном контексте this будет.

 


Название: Re: Прошу помочь
Отправлено: torwig от Март 02, 2015, 19:22
1. Чтобы использовать сигналы и слоты (что у Вас используется) нужно отнаследоваться от QObject и написать макрос Q_OBJECT:
Цитировать
#include <QObject>

class Test_class: public QObject
{
    Q_OBJECT
public:
   Test_class::Test_class();
   ~Test_class();
public slots:
    void replyFinished(QNetworkReply*); // тот самый слот, который вы подключаете к сигналу finished
};

2. this будет у Вас экземпляр класса Test_class.


Название: Re: Прошу помочь
Отправлено: stud от Март 02, 2015, 19:45
Спасибо, тебе милый человек, дело сдвинулось. Видел такой код в примере, не понимал, что он делает.

Теперь код выглядит так:
.h файл
Код:
#pragma once
#include <QObject>
#include <QtNetwork\qnetworkreply.h>

class Test_class : public QObject
{
Q_OBJECT
public:
Test_class::Test_class();
~Test_class(void);
public slots:
    //void replyFinished(QNetworkReply* reply); // тот самый слот, который вы подключаете к сигналу finished
void finishedSlot(QNetworkReply* reply);
};

cpp файл:
Код:
#include "Test_class.h"
#include <QtCore/QCoreApplication>
#include <QtNetwork\qnetworkaccessmanager.h>
#include <QtNetwork\qnetworkrequest.h>
#include <QtNetwork\qnetworkreply.h>
#include <qurl.h>
#include <QObject>

//#include <MultiWidgets/Application.hpp>
//#include "httprequest.h"


#include <Qt/qdebug.h>

Test_class::Test_class()
{

qDebug() << "into constructor Test_class";

QNetworkAccessManager *netman = new QNetworkAccessManager();

//QObject::connect(netman, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));

netman->get(QNetworkRequest(QUrl("http://www.ya.ru")));

//qDebug() << reply;

//connect(netman, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));

//HttpRequest req;
//req.processRequest("www.ya.ru");

}


Test_class::~Test_class(void)
{
}

void Test_class::finishedSlot(QNetworkReply* reply)
{
//    // Не произошло-ли ошибки?
//    if (reply->error() == QNetworkReply::NoError)
//    {
//        // Читаем ответ от сервера
//        QByteArray bytes = reply->readAll();
//        QString string(bytes);
//
//        // Выводим ответ на экран
//        qDebug() << string;
//    }
//    // Произошла какая-то ошибка
//    else
//    {
//        // обрабатываем ошибку
//        qDebug() << reply->errorString();
//    }
//    delete reply;
}

Остались ошибки линковщика:
Ошибка   2   error LNK2001: неразрешенный внешний символ ""public: virtual struct QMetaObject const * __cdecl Test_class::metaObject(void)const " (?metaObject@Test_class@@UEBAPEBUQMetaObject@@XZ)"   
Ошибка   3   error LNK2001: неразрешенный внешний символ ""public: virtual void * __cdecl Test_class::qt_metacast(char const *)" (?qt_metacast@Test_class@@UEAAPEAXPEBD@Z)"   D:\Стол\Виджет для Test_class\HelloWorldExample\Test_class.obj

В какую сторону копать?


Название: Re: Прошу помочь
Отправлено: ammaximus от Март 02, 2015, 19:48
Когда написал макрос нужно вызвать команду qmake


Название: Re: Прошу помочь
Отправлено: ammaximus от Март 02, 2015, 19:49
 И никаких русских имен в названии каталогов под виндой!!!


Название: Re: Прошу помочь
Отправлено: stud от Март 02, 2015, 19:56
И никаких русских имен в названии каталогов под виндой!!!
Шел 2015 год :). Переименовал папку.

Когда написал макрос нужно вызвать команду qmake
Не смотря на то, что я в Visual Studio проект пишу?


Название: Re: Прошу помочь
Отправлено: ammaximus от Март 02, 2015, 20:07
Про  студию сказать точно не могу, но ручной ввод маросов не вызывает кмак. Автомат реагирует только на команды создания, в лучшем случае рефакторинг. Ручной кмак незаменим.

У винды вечные проблемы с переходом на юникод, а почему кютешные модули не работают в ее кодировке сказать не могу.


Название: Re: Прошу помочь
Отправлено: RSATom от Март 03, 2015, 07:52
Для использования Qt со студией нужно либо пользоваться Qt Visual Studio AddIn (http://download.qt-project.org/official_releases/vsaddin/qt-vs-addin-1.2.4-opensource.exe) либо использовать cmake. Первое проще.


Название: Re: Прошу помочь
Отправлено: Day от Март 03, 2015, 09:01
ИМХО, нужно еще в pro-файл добавить HEADERS += твой хедер с Q_OBJECT
Только после этого qmake


Название: Re: Прошу помочь
Отправлено: stud от Март 03, 2015, 13:04
Ребят, я может сейчас глупость скажу, но смотрите, мне дали проект, в котором был файл .pro, для разработки в Visual Studio было необходимо выполнить qmake -tp vc <project file>, были созданы файлы для работы в студии. Открыл в студии и начал дописывать то, что мне нужно. Теперь вопрос, что в итоге делает qmake, чего нельзя сделать в студии? qmake ругается на QMAKESPEC has not been set.
Результат пока следующий, если закоментить в хидере Q_OBJECT, то проект компилируется и при выполнении не видит слот, что видимо верно.
Object::connect: No such slot QObject::replyFinished(QNetworkReply*)


Название: Re: Прошу помочь
Отправлено: RSATom от Март 03, 2015, 13:18
Qt Visual Studio Add-In стоит? если да то он позволяет делать .pro файл на основе текущего Visual Studio проекта.


Название: Re: Прошу помочь
Отправлено: stud от Март 03, 2015, 13:23
Qt Visual Studio Add-In стоит? если да то он позволяет делать .pro файл на основе текущего Visual Studio проекта.
Оно?
http://download.qt.io/official_releases/vsaddin/
Сейчас скачаю, поставлю, попробую.
Скачал, попробовал поставить, ругается, что Visual C++ Express is not supported, пошел искать дальше.


Название: Re: Прошу помочь
Отправлено: RSATom от Март 03, 2015, 14:58
А какой смысл в нынешнее время использовать Visual Studio Express, когда есть Visual Studio Community 2013 (искать тут (http://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx))? Если же по каким либо причинам использовать Community Edition возможности нет, то уж лучше тогда QtCreator. т.к. использование VS Express в связке с Qt попахивает мазохизмом. А новичка вообще может привести к трудно понимаемым проблемам...


Название: Re: Прошу помочь
Отправлено: stud от Март 03, 2015, 15:15
А какой смысл в нынешнее время использовать Visual Studio Express, когда есть Visual Studio Community 2013 (искать тут (http://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx))? Если же по каким либо причинам использовать Community Edition возможности нет, то уж лучше тогда QtCreator. т.к. использование VS Express в связке с Qt попахивает мазохизмом. А новичка вообще может привести к трудно понимаемым проблемам...
Спасибо за ответ, но требования платформы использовать Visual Studio 2012, не спрашивайте почему так, но прямо в SDK указано:

C++
To compile C++ code in SDK Visual Studio 2012 compiler is required. It is not possible to use older versions of Visual Studio because of the C++11 language features that are used in Cornerstone. It is possible to use the Visual Studio 2012 Express for Windows Desktop available from http://www.microsoft.com/visualstudio/eng/downloads.

Попробую сейчас рядом еще студию поставить 2013, но по-моему там есть проблемы.
Еще добавлю, что QT в чистом виде не ставилось, ставилось только SDK.

По теме, как я понял проблема с moc файлом - он не формируется.
Попробовал вручную сделать что-то типа moc.exe Test_class.moc Test_class.cpp получил No relevant classes found.


Название: Re: Прошу помочь
Отправлено: Bepec от Март 03, 2015, 15:54
Qt не бачит с Express версиями. Или 2012 цельную ставьте, или тупо компилятор используйте.
Проблема скорее надуманная, чем реальная на мой взгляд.

PS Qt это и есть SDK. Не путайте Qt(библиотеки) и Qt creator(ide под библиотеки) :)


Название: Re: Прошу помочь
Отправлено: stud от Март 03, 2015, 16:06
Qt не бачит с Express версиями. Или 2012 цельную ставьте, или тупо компилятор используйте.
Проблема скорее надуманная, чем реальная на мой взгляд.

PS Qt это и есть SDK. Не путайте Qt(библиотеки) и Qt creator(ide под библиотеки) :)
Visual Studio Community 2013 - считается цельной или это тоже урезанная? Попробую ее поставить?
А что вы имеете в виду под "тупо компилятор используйте"?
qmake вручную вызвать?
Я же писал, что пробовал, ругается на QMAKESPEC has not been set. попробовал с опциями, та же петрушка.


Название: Re: Прошу помочь
Отправлено: ibnz от Март 03, 2015, 16:35
http://doc.crossplatform.ru/qt/4.3.5/qmake-environment-reference.html


Название: Re: Прошу помочь
Отправлено: Bepec от Март 03, 2015, 17:08
Если нет надписи Express, то работает :)

Ну значит у вас неправильный про файл к примеру.

Напрямую - это вызвать nmake по VS файлу проекта, который создан с помощью QMake вроде бы :)


Название: Re: Прошу помочь
Отправлено: RSATom от Март 03, 2015, 19:42
Спасибо за ответ, но требования платформы использовать Visual Studio 2012, не спрашивайте почему так, но прямо в SDK указано:

О каком SDK идет речь? Какую версию Qt вы используете?

Если поставить Visual Studio Express 2012, а затем Visual Studio Comuntiy 2013 - есть подозрение что в этом случае в 2013 студии можно будет выбрать тулкит из 2012-ой (если уж так сильно нужен компилятор из 12-ой студии).