• 7861阅读
  • 3回复

关于一个图片浏览器 [复制链接]

上一主题 下一主题
离线tanglek
 

只看楼主 倒序阅读 楼主  发表于: 2009-07-24
我照着《精通qt4编程》一书的第六章的一个图片浏览器的代码,自己去掉了一些功能,只实现基本的浏览,但是就是不能显示图片,代码如下,大家帮我找找问题好吗?谢了先。。。

imgwidget.h
================================================================================================
#ifndef imgwidget_h
#define imgwidget_h

#include <QtGui>

class ImageWidget:public QWidget
{
Q_OBJECT
public:
bool fit;
qreal scale;
ImageWidget(QWidget* parent=0);
void setPixmap(QString filename);

protected:
void paintEvent(QPaintEvent *pevent);

private:
QPixmap pixmap;
};
#endif
================================================================================================
imgwidget.cpp
================================================================================================
#include <QtCore>
#include <QtDebug>
#include "imgwidget.h"
ImageWidget::ImageWidget(QWidget* parent)
:QWidget(parent)
{
    QDesktopWidget desktop;
    pixmap=QPixmap(desktop.width(),desktop.height());
    scale=1;
    fit=true;
}

void ImageWidget::paintEvent(QPaintEvent *pevent)
{
    QPainter painter(this);
    if(fit)
    {
        QPixmap fitpixmap=pixmap.scaled(width(),height(),Qt::KeepAspectRatio);
        painter.drawPixmap(0,0,fitpixmap);
    }
    else
        painter.drawPixmap(0,0,pixmap);
}
void ImageWidget::setPixmap(QString filename)
{
    pixmap.load(filename);
    update();
}


================================================================================================
mainwin.h
================================================================================================
#ifndef mainwin_h
#define mainwin_h

#include <QMainWindow>
#include <QScrollArea>
#include <QDir>
#include "imgwidget.h"

class mainwin:public QMainWindow
{
    Q_OBJECT

public:
    mainwin();

public slots:
        void selectdir();
        void next();
        void prev();

private:
    void createActions();
    void createMenu();
    void createToolbar();
    void createStatusbar();

    QScrollArea *scrollArea;
    ImageWidget* imgWidget;

    QMenu *navimenu;
    QToolBar *navitoolbar;

    QAction *dirAct;
    QAction *nextAct;
    QAction *prevAct;

    
    QStringList imglist;
    int index;
    QDir imgdir;
};
#endif

================================================================================================
mainwin.cpp
================================================================================================
#include <QtGui>
#include "mainwin.h"

mainwin::mainwin()
{
    imgWidget=new ImageWidget;
    scrollArea=new QScrollArea;
    scrollArea->setBackgroundRole(QPalette::Dark);
    imgWidget->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);
    scrollArea->setWidget(imgWidget);
    scrollArea->widget()->setMaximumSize(640,480);
    setCentralWidget(scrollArea);

    createActions();
    createMenu();
    createToolbar();
    createStatusbar();
    setWindowTitle(tr("picbrowser"));
    setFocusPolicy(Qt::StrongFocus);

    index=0;

    imgdir.setPath(QDir::currentPath());
    QStringList filter;
    filter<<"*.jpg"<<"*.bmp"<<"*.jpeg"<<"*.png";
    imglist=imgdir.entryList(filter,QDir::Files);
    next();
}

void mainwin::createActions()
{
    dirAct=new QAction(QIcon(":/image/open.png"),tr("open"),this);
    dirAct->setShortcut(QKeySequence::Open);
    connect(dirAct,SIGNAL(triggered()),this,SLOT(selectdir()));

    prevAct=new QAction(QIcon(":/image/previous.png"),tr("previous"),this);
    prevAct->setShortcut(QKeySequence::Back);
    connect(prevAct,SIGNAL(triggered()),this,SLOT(prev()));

    nextAct=new QAction(QIcon(":/image/next.png"),tr("next"),this);
    nextAct->setShortcut(QKeySequence::Forward);
    connect(nextAct,SIGNAL(triggered()),this,SLOT(next()));
}
void mainwin::createMenu()
{
    navimenu=menuBar()->addMenu(tr("navi"));
    navimenu->addAction(dirAct);
    navimenu->addAction(prevAct);
    navimenu->addAction(nextAct);
}
void mainwin::createToolbar()
{
    navitoolbar=addToolBar(tr("navi"));
    navitoolbar->addAction(dirAct);
    navitoolbar->addSeparator();
    navitoolbar->addAction(prevAct);
    navitoolbar->addAction(nextAct);

}
void mainwin::createStatusbar()
{
    statusBar()->showMessage("ready");

}
void mainwin::selectdir()
{
    QString dir=QFileDialog::getExistingDirectory(this,tr("open directory"),QDir::currentPath(),QFileDialog::ShowDirsOnly|QFileDialog::DontResolveSymlinks);
    if(dir.isEmpty())
    {
        statusBar()->showMessage("the list is empty!");
        return;
    }
    imgdir.setPath(dir);
    QStringList filter;
    filter<<"*.jpg"<<"*.bmp"<<"*.jpeg"<<"*.png";
    imglist=imgdir.entryList(filter,QDir::Files);
    next();
}
void mainwin::next()
{
    if(index<imglist.size())
    {
        imgWidget->setPixmap(imgdir.absolutePath()+QDir::separator()+imglist.at(index));
        statusBar()->showMessage(imgdir.absolutePath()+QDir::separator()+imglist.at(index));
        index++;
    }
}
void mainwin::prev()
{
    if(index>0)
    {
        imgWidget->setPixmap(imgdir.absolutePath()+QDir::separator()+imglist.at(index));
        statusBar()->showMessage(imglist.at(index));
        index--;
    }
}
================================================================================================
main.cpp
================================================================================================
#include <QApplication>
#include <QTextCodec>

#include "mainwin.h"

int main(int argc, char *argv[])
{
   Q_INIT_RESOURCE(myapp);

    QApplication app(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
    mainwin mainWin;
    mainWin.showMaximized();
    return app.exec();
}
离线tanglek

只看该作者 1楼 发表于: 2009-07-25
自己顶一下:
我的程序效果图如下:

书上的效果是这样:

开始程序并未读入图像,为什么pixmap的初始化代码一样,效果却不一样??有人有类似的问题吗?
  
离线tanglek

只看该作者 2楼 发表于: 2009-07-26
发现问题了 ,好弱啊。。。。
问题出在
scrollArea->widget()->setMaximumSize(640,480)
应为
scrollArea->widget()->setMinimumSize(640,480)

QWidget:QSize
By default, this property contains a size with zero width and height.
离线feline

只看该作者 3楼 发表于: 2009-07-28
楼主应该标上“已解决”字样
[操作系统版本]  Windows.2k.pro_en
[Qt SDK版本]    4.5.1
[SDK 发布日期]  2009.02
[IDE(集成开发环境)] 命令行
快速回复
限100 字节
 
上一个 下一个