Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qt. Как нарисовать скачанную в QByteArray иконку 
:(
    Опции темы
ssstttuuufff
Дата 6.5.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



1. Есть переменная QByteArray icon и QPixmap pixmap 
2. С помощью Qhttp я скачиваю в icon картинку -  например  favicon.ico с какого-нибудь сайта.
3. Пытаюсь сделать так:

 
Код

   pixmap.loadFromData(icon);
    pixmap.toImage(); // пробовал и без этого шага
    setWindowIcon(QIcon(pixmap));


Ничего не отображается.  Притом с PNG'шкой тоже ничего не работает. 



Это сообщение отредактировал(а) ssstttuuufff - 6.5.2008, 13:35
PM MAIL   Вверх
JackYF
Дата 6.5.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Как скачивал (код)?
Совпал ли QByteArray с тем, как если бы он был загружен из локального файла, а не через QHttp?
Работает ли SetWindowIcon, если QPixmap сделать прямо в программе (нарисовать там палочку какую-нибудь)?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
ssstttuuufff
Дата 6.5.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



JackYF

ТОлько что проверял размер файла и размер QByteArray переменной. Когда скачивал favicon.ico, то размер сходился. А когда скачивал png, то размер был разынй. Притом у меня есть два метода в классе, который скаивает файлы. 1 метод скачивает в локальный файл, а второй скачивает в QByteArray переменную. 2 метод похоже подкглючивает. Вот код класса:

cfiledownloader.h
Код

#ifndef CFILEDOWNLOADER_H
#define CFILEDOWNLOADER_H
//
#include <QFile>
#include <QHttp>
#include <QString>
#include <QByteArray> 
//
class QUrl;
class CFileDownloader : public QObject
{
Q_OBJECT
public:
    CFileDownloader(QObject *parent = 0);
    QHttp http;
    bool getFile(const QString &link);
    bool getFileInByteArray(const QString &link);
    bool IsValidUrl(const QUrl &link);
    QByteArray fileByteArray;
signals:
        void done();
private:
    QFile file;
    int connectionId;
private slots:
    void finished(int id, bool error);
    void httpDone(bool error);
    void readInByteArray(const QHttpResponseHeader &);
    
    
};
#endif


cfiledownloader.cpp
Код

#include "cfiledownloader.h"
#include <QMessageBox>
#include <QFileInfo>
#include <QUrl>

//
CFileDownloader::CFileDownloader(QObject *parent) : QObject(parent)
{
    // TODO
    connect(&http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));
    
     connect(&http, SIGNAL(readyRead(const QHttpResponseHeader &)),
             this, SLOT(readInByteArray(const QHttpResponseHeader &)));
             
    connect(&http, SIGNAL(requestFinished(int, bool)),
            this, SLOT(finished(int, bool)));    
             

}
//

void CFileDownloader::finished(int id, bool error)
{
    
    if (error) 
    {
        QMessageBox::critical(0, tr("Error during HTTP ferch"),
                  QString("Received error during HTTP fetch: \r\n %1") . arg(http.errorString()) ,
                  QMessageBox::Ok);                                 
    }
    
    else if (id == connectionId)
    {
        
        if (fileByteArray.isEmpty())
            QMessageBox::warning(0, tr("File"), "File Downloaded is empty" );
        else
            {
            QMessageBox::warning(0, tr("File"), "File Downloaded is not empty " + QString("%1") . arg(fileByteArray.length())  );
            emit done();
            }
     }
    
    
}

void CFileDownloader::readInByteArray(const QHttpResponseHeader &resp)
{
    
    if (resp.statusCode() != 200)
        http.abort();
    else
        fileByteArray = http.readAll();
}

bool CFileDownloader::IsValidUrl(const QUrl &url)
{
    if (!url.isValid()) {
        QMessageBox::warning(0, tr("Error in Url"), "Error: Invalid URL");        
        return false;
    }

    if (url.scheme() != "http") {
        QMessageBox::warning(0, tr("Error in Url"), "Error: URL must start with 'http:'");
        return false;
    }

    if (url.path().isEmpty()) {
        QMessageBox::warning(0, tr("Error in Url"), "Error: URL has no path");        
        return false;
    }

    return true;
}

bool CFileDownloader::getFileInByteArray(const QString &link)
{
    QUrl url(link);
    
    if (!IsValidUrl(url));
        return false;
        

    http.setHost(url.host());
    connectionId = http.get(url.path());

    return true;
}

bool CFileDownloader::getFile(const QString &link)
{
    QUrl url(link);
    
    
    if (!IsValidUrl(url))
        return false;

    QString localFileName = QFileInfo(url.path()).fileName();
    if (localFileName.isEmpty())
        localFileName = "httpget.out";


    file.setFileName(localFileName);
    if (!file.open(QIODevice::WriteOnly)) {
        QMessageBox::warning(0, tr("File Error"), "Error: Cannot open " + file.fileName() +  " for writing: " + file.errorString() );        
        return false;
    }

    http.setHost(url.host(), url.port(80));
    http.get(url.path(), &file);
    
    //fileByteArray = http.readAll();
    
    http.close();
    return true;
}

void CFileDownloader::httpDone(bool error)
{
    if (error) 
        QMessageBox::warning(0, tr("Error"), http.errorString());
     
        
    file.close();
    emit done();
}


Цитата

Работает ли SetWindowIcon, если QPixmap сделать прямо в программе (нарисовать там палочку какую-нибудь)? 


Не знаю как рисовать палочку. Но если делать так setWindowIcon(QIcon("/tmp/my.png"));, то работает, а вот так 
setWindowIcon(QIcon("/tmp/favicon.ico")); не работает.

Видимо файлы .ico Qt никак не хочет воспринимать, но и проблемы с загрузкой файла из инета у меня видимо есть.
PM MAIL   Вверх
SABROG
Дата 6.5.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



http://doc.trolltech.com/4.4/qimagereader....tedImageFormats

Ico не поддерживается.

http://trolltech.com/products/qt/addons/ca...ticoimageformat

Это сообщение отредактировал(а) SABROG - 6.5.2008, 14:27


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1043 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.