• 10049阅读
  • 6回复

http下载并显示图片的两个问题请教(结贴) [复制链接]

上一主题 下一主题
离线wvins
 
只看楼主 倒序阅读 楼主  发表于: 2008-09-30
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
先上附件源代码 FavIcon.tar.gz (0 K) 下载次数:29 :
以下是核心代码:
#ifndef H_DLGFAVICON_H
#define H_DLGFAVICON_H
#include <QDialog>
#include <QHttp>
#include <QUrl>
#include <QDebug>
#include <QMessageBox>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QFile>
#include <QTemporaryFile>
#include "ui_DisplayFavIcon.h"

class DlgFavIcon: public QDialog
{
    Q_OBJECT
public:
    DlgFavIcon():QDialog()
    {
        finished= false;
        ui.setupUi(this);
        connect(ui.pushButton, SIGNAL(clicked()),
                this, SLOT(displayIcon()));
    connect(&http, SIGNAL(requestFinished(int, bool)),
        this, SLOT(workFinished(int, bool)));   
    }

private:
    QHttp http;
    QUrl url;
//    QTemporaryFile file;
    QPixmap pixmap;
    Ui_Dialog ui;
    bool finished;
private slots:
    void displayIcon()
    {
    QFile file("a.ico");
    if (!file.open(QIODevice::ReadWrite))
    {
        QMessageBox::information(0, "", "File Open Failed");
        return;
    }
    url.setUrl("http://www.163.com/favicon.ico");
    http.setHost(url.host());
        http.get(url.path(), &file);
/*        while (not finished)
        {
            sleep(3);
        }*/
//如果死循环等待的话,总是会阻塞在这个地方
//QHttp的异步好像不是通过多线程实现的,那么QT

//中有没有类似Delphi的ProcessMessages方法呢?
        if (file.size() == 0)
        {
            QMessageBox::information(0, "Information", "file not down!");
            return;
        }
    else
            QMessageBox::information(0, "Information", "file down!");
//    ui.pushButton->setIcon(QIcon(QPixmap("a.bmp")));
//在Ubuntu中,需要手动把icon图标转换成bmp图片格式才能够正常加载显示

    ui.pushButton->setIcon(QIcon("a.ico"));
//在Windows中直接加载Icon图标就可以了
    }

    void workFinished ( int id, bool error )
    {
        if (error)
            QMessageBox::information(0, "Information", http.errorString());
        finished = true;
    }

    void workDone(bool error)
    {
    finished = true;
    if (error)
        QMessageBox::information(0, "Information", http.errorString());
    }
};

#endif
现整理两个问题,如下:
1. QT有没有方法在死婚环中检查消息队列,并处理消息的方法?
    在Delphi中是Application.ProcessMessages方法
2. Linux下要怎么加载Icon?通过QIcon不能正常加载,但是同样的代码在Windows下面没有问题。
    Linux下我通过apt-get install 方式安装的Qt4,不是自己编译的源代码,不知道会不会和这有关系
[ 此帖被wvins在2009-05-25 15:03重新编辑 ]
离线wvins
只看该作者 1楼 发表于: 2008-10-01
Coming Back!

花了整整一个下午的时间安装了代码版的Qt 最新4.4.2版,
也不知道空间都用在哪了,吃了我差不多3个G...
(太辛苦了,本想把这个过程记录下来的,又不知道自己时间都花在解决什么问题上了,就坐罢了)

同样的代码,在Ubuntu下面也能够正常加载Icon了,
现在基本可以认定是apt-get install 方式安装的问题了。


剩下另一个问题就是类似Application.ProcessMessages的方法了
[ 此贴被wvins在2008-11-09 11:06重新编辑 ]
离线lgh603
只看该作者 2楼 发表于: 2008-10-01
其实你也可以在QHttp的requestFinished(int, bool)事件里再显示图标啊
QHttp应该是使用多线程来设计的,猜测的
离线wvins
只看该作者 3楼 发表于: 2008-10-01
当然,只是我真不希望这么作
----
我的逻辑很简单,就是    下载,显示。

而那么做得逻辑是
A:帮我下载个东西,
B:东西下载完成,你还有事要做吗?
A:显示图像
----
大概萝卜白菜,各有所爱吧~
我通常的习惯是把这种情况的异步调用通过等待序列化。

我还是希望有这么个方法~
(忽然有个奇怪的想法,不是因为apt-get install的方式导致死循环吧?)
离线wvins
只看该作者 4楼 发表于: 2008-11-09
今天修改这段代码,让我找到了类似Delphi的processMessages方法。
可以使用QApplication::processEvents  静态方法

不过我一使用,程序就崩溃了

使用insight调试,报
Program received signal SIGABRT, Aborted.的错。

百思不得其解,只能够确定是processEvents的错,修改参数为
QApplication::processEvents(QEventLoop::ExcludeSocketNotifiers);
问题消失,大概是网络异常导致的吧

BTW:
为什么我使用gdb list只能看到汇编代码呢?
烦请各位指点一二

忘了,下回预告:
搞定QHttp的NTLM认证。
[ 此贴被wvins在2008-11-09 20:36重新编辑 ]
离线shiroki

只看该作者 5楼 发表于: 2009-05-25
如果用qt编程就应该遵循qt的设计理念, 就是应该响应requestFinished信号的, 既不能死循环等待, 也别独辟蹊径调 processEvents
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线wvins
只看该作者 6楼 发表于: 2009-05-25
这么老的帖子都给翻出来了...
快速回复
限100 字节
 
上一个 下一个