Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] QMap не хочет работать QNetworkAccessManager


Автор: Валерия 17.12.2011, 21:49
Код
#include <QtCore/QCoreApplication>
#include <QNetworkRequest>
#include <QNetworkReply>

QMap<int, QNetworkAccessManager> browsers;

int main(int argc, char *argv[]){
    QCoreApplication a(argc, argv);
    
    browsers[1] = QNetworkAccessManager(); 
    browsers[2] = QNetworkAccessManager(); 
       
    return a.exec();
}
Это весь код.
Выдает невероятное количество ошибок.
Когда вместо QNetworkAccessManager я пытаюсь использовать какой-то другой класс - всё работает отлично.
ОЧЕНЬ большая просьба: не писать сообщения в стиле "тебе оно не нужно".
Я знаю как можно сделать то что мне нужно другим вариантом, но мне уж очень интересно почему не выходит этим.
Особенность QNetworkAccessManager?

Ошибочки вот:
Код
C:\Folder\Projects\testing\untitled-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\..\..\..\..\QtSDK\Desktop\Qt\4.7.4\mingw\include\QtNetwork\QNetworkAccessManager:1: In file included from ..\..\..\..\QtSDK\Desktop\Qt\4.7.4\mingw\include/QtNetwork/QNetworkAccessManager:1,
C:\Folder\Projects\testing\untitled-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\..\..\..\..\QtSDK\Desktop\Qt\4.7.4\mingw\include\QtNetwork\qnetworkreply.h:50: from ..\..\..\..\QtSDK\Desktop\Qt\4.7.4\mingw\include\QtNetwork/qnetworkreply.h:50,
C:\Folder\Projects\testing\untitled-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\..\..\..\..\QtSDK\Desktop\Qt\4.7.4\mingw\include\QtNetwork\QNetworkReply:1: from ..\..\..\..\QtSDK\Desktop\Qt\4.7.4\mingw\include\QtNetwork/QNetworkReply:1,
C:\Folder\Projects\testing\untitled-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\..\untitled\main.cpp:3: from ..\untitled\main.cpp:3:
C:\Folder\Projects\testing\untitled-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\..\..\..\..\QtSDK\Desktop\Qt\4.7.4\mingw\include\QtCore\qobject.h:-1: In member function 'QNetworkAccessManager& QNetworkAccessManager::operator=(const QNetworkAccessManager&)':
C:\Folder\Projects\testing\untitled-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\..\..\..\..\QtSDK\Desktop\Qt\4.7.4\mingw\include\QtCore\qobject.h:309: ошибка: 'QObject& QObject::operator=(const QObject&)' is private
C:\Folder\Projects\testing\untitled-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\..\..\..\..\QtSDK\Desktop\Qt\4.7.4\mingw\include\QtNetwork\qnetworkaccessmanager.h:72: ошибка: within this context
C:\Folder\Projects\testing\untitled-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\..\untitled\main.cpp:-1: In function 'int main(int, char**)':
и еще много-много
Попробуйте у себя запустить код что бы увидеть все...

Автор: bsa 17.12.2011, 22:36
Ошибка очень простая. Основной ее текст в 6-й строке: "QObject::operator= is private". Это значит, что оператор присваивания определен в приватной зоне класса. Обычно, это делают, когда хотят запретить присваивание (читай копирование). В частности, все наследники QObject по умолчанию не могут копироваться.

Для решения твоей проблемы необходимо использовать указатели на QNetworkAccessManager. Рекомендую использовать "умные" (QSharedPointer).

Автор: Валерия 17.12.2011, 23:00
Цитата(bsa @ 17.12.2011,  22:36)
Для решения твоей проблемы необходимо использовать указатели на QNetworkAccessManager. Рекомендую использовать "умные" (QSharedPointer).

Если не сложно, можно на примере?
Я только третий день на Qt пишу smile
Мне нужно что бы я могла с потока сохранить в глобальный ассоциативный массив состояние "браузера", а потом при необходимости его вернуть в поток и использовать дальше.

Автор: Artemon 17.12.2011, 23:08
QMap<int, QNetworkAccessManager*> browsers;
..
..
..
browsers[1] = new QNetworkAccessManager(); 
browsers[2] = new QNetworkAccessManager(); 


Для начала пойдет

Автор: Валерия 17.12.2011, 23:12
Код

cannot convert 'QNetworkAccessManager' to 'QNetworkAccessManager*' in assignment

Автор: Artemon 18.12.2011, 18:19
QMap<int, QNetworkAccessManager*> browsers;

Автор: bsa 18.12.2011, 19:50
Лучше так:
Код
typedef QSharedPointer<QNetworkAccessManager> QNetworkAccessManagerPtr;
QMap<int, QNetworkAccessManagerPtr> browsers;
..
..
..
browsers[1] = QNetworkAccessManagerPtr(new QNetworkAccessManager()); 
browsers[2] = QNetworkAccessManagerPtr(new QNetworkAccessManager());
Это спасет от утечек памяти.

Автор: Валерия 18.12.2011, 20:28
Artemon, со звёздочкой и пробывала. Ту ошибку что выдавало - написала, но уже в принципе не важно, потому что...

bsa, огромное спасибо! Работает всё именно так как я и хотела smile

Автор: Валерия 18.12.2011, 21:22
Упс... Проверила всё это на потоках...
Не совсем работает.
Я так понимаю что browsers может быть использован только в том потоке, в котором был создан?
Потому что пишет "Cannot create children for a parent that is in a different thread" когда пытаюсь обратится к ранее созданному browsers[0] который был создан из другого потока.

Автор: bsa 19.12.2011, 00:13
Валерия, как ты сама заметила вначале, решение использовать кучу этих классов скорее всего неверное. Но это уже отдельная тема для разговора (если вбить текст выдаваемой ошибки в гугл, то можно получить результат без создания дополнительной темы, тем более, что это уже обсуждалось и не раз).

Если ответ на свой вопрос ты получила, то пометь тему решенной.

Автор: Валерия 19.12.2011, 10:54
Цитата(bsa @  19.12.2011,  00:13 Найти цитируемый пост)
Если ответ на свой вопрос ты получила, то пометь тему решенной. 

Скорее всего вы правы.
Я понимаю что рублю спички топором smile
Потому что на самом то деле, мне нужно что бы сохранялась авторизация, и я могла ней потом воспользоватся, поэтому достаточно сохранить куки smile
Ну, или попробовать сделать серилиазацию объекта...

Автор: Валерия 19.12.2011, 18:49
Решила свой вопрос через:
Код
QMap <QString, QList <QNetworkCookie> > cookmap;
...................
QNetworkCookieJar cooked;
...................
nwam.setCookieJar(&cooked);
...................
cooked.setAllCookies(cookmap[akk]);
...................
cookmap[akk] = cooked.allCookies();
Всем спасибо smile
P.S правда все-равно интересно, почему не получилось читать объект если он был создан в другом потоке, поэтому с этим вопросом еще разберусь smile

Автор: bsa 19.12.2011, 20:10
Цитата(Валерия @  19.12.2011,  19:49 Найти цитируемый пост)
P.S правда все-равно интересно, почему не получилось читать объект если он был создан в другом потоке, поэтому с этим вопросом еще разберусь
я дал тебе инструкцию по получению ответа. воспользуйся ей.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)