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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Прошу помочь  (Прочитано 8319 раз)
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 будет.

 
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #1 : Март 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.
« Последнее редактирование: Март 02, 2015, 19:23 от torwig » Записан
stud
Гость
« Ответ #2 : Март 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

В какую сторону копать?
Записан
ammaximus
Гость
« Ответ #3 : Март 02, 2015, 19:48 »

Когда написал макрос нужно вызвать команду qmake
Записан
ammaximus
Гость
« Ответ #4 : Март 02, 2015, 19:49 »

 И никаких русских имен в названии каталогов под виндой!!!
Записан
stud
Гость
« Ответ #5 : Март 02, 2015, 19:56 »

И никаких русских имен в названии каталогов под виндой!!!
Шел 2015 год Улыбающийся. Переименовал папку.

Когда написал макрос нужно вызвать команду qmake
Не смотря на то, что я в Visual Studio проект пишу?
Записан
ammaximus
Гость
« Ответ #6 : Март 02, 2015, 20:07 »

Про  студию сказать точно не могу, но ручной ввод маросов не вызывает кмак. Автомат реагирует только на команды создания, в лучшем случае рефакторинг. Ручной кмак незаменим.

У винды вечные проблемы с переходом на юникод, а почему кютешные модули не работают в ее кодировке сказать не могу.
Записан
RSATom
Гость
« Ответ #7 : Март 03, 2015, 07:52 »

Для использования Qt со студией нужно либо пользоваться Qt Visual Studio AddIn либо использовать cmake. Первое проще.
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #8 : Март 03, 2015, 09:01 »

ИМХО, нужно еще в pro-файл добавить HEADERS += твой хедер с Q_OBJECT
Только после этого qmake
Записан
stud
Гость
« Ответ #9 : Март 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*)
Записан
RSATom
Гость
« Ответ #10 : Март 03, 2015, 13:18 »

Qt Visual Studio Add-In стоит? если да то он позволяет делать .pro файл на основе текущего Visual Studio проекта.
« Последнее редактирование: Март 03, 2015, 13:19 от RSATom » Записан
stud
Гость
« Ответ #11 : Март 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, пошел искать дальше.
« Последнее редактирование: Март 03, 2015, 13:26 от stud » Записан
RSATom
Гость
« Ответ #12 : Март 03, 2015, 14:58 »

А какой смысл в нынешнее время использовать Visual Studio Express, когда есть Visual Studio Community 2013 (искать тут)? Если же по каким либо причинам использовать Community Edition возможности нет, то уж лучше тогда QtCreator. т.к. использование VS Express в связке с Qt попахивает мазохизмом. А новичка вообще может привести к трудно понимаемым проблемам...
Записан
stud
Гость
« Ответ #13 : Март 03, 2015, 15:15 »

А какой смысл в нынешнее время использовать Visual Studio Express, когда есть Visual Studio Community 2013 (искать тут)? Если же по каким либо причинам использовать 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.
« Последнее редактирование: Март 03, 2015, 15:19 от stud » Записан
Bepec
Гость
« Ответ #14 : Март 03, 2015, 15:54 »

Qt не бачит с Express версиями. Или 2012 цельную ставьте, или тупо компилятор используйте.
Проблема скорее надуманная, чем реальная на мой взгляд.

PS Qt это и есть SDK. Не путайте Qt(библиотеки) и Qt creator(ide под библиотеки) Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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