tags:

views:

160

answers:

0

Hello everybody,

I want to use qt jambi to make screenshots. I use the integrated webkit browser and it works like a charm. The problem is:

how can I initialize

QApplication.initialize(args);

outside of the main method. Since I want to make screenshots out of my java web application without calling an external program I need to initialize QApplication outside of main.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import com.trolltech.qt.core.QObject;
import com.trolltech.qt.core.QUrl;
import com.trolltech.qt.gui.QApplication;
import com.trolltech.qt.gui.QImage;
import com.trolltech.qt.gui.QPainter;
import com.trolltech.qt.webkit.QWebPage;
import com.trolltech.qt.webkit.QWebView;

/**
 * 
 * @author Marc Giombetti Created on: 16.04.2010
 */
public class ScreenshotWithoutWindow {
    private QWebView browser;

    /**
     * @param args
     */
    public static void main(String[] args) {
        if (args.length > 2) {
            String file = args[0];
            String baseUrl = args[1];
            String writeTo = args[2];

            Thumbnailer thumbnail = new Thumbnailer(file, baseUrl, writeTo);

        } else {
            System.out.println("Please provide file, baseURL and savetoPath parameters");
            System.out
                    .println("For example:java -jar ScreenshotWithoutWindow C:\\test\\test.htm file:///C:/Marc/test/ c:\\screenshot\\screenshot-new.png");
        }
    }

    public static class Thumbnailer extends QObject {
        private QWebPage page = new QWebPage();
        public Signal0 finished = new Signal0();
        private static String file;
        private static String baseUrl;
        private static String writeTo;

        public Thumbnailer(String _file, String _baseUrl, String _writeTo) {
            file = _file;
            baseUrl = _baseUrl;
            writeTo = _writeTo;

            initialize();

        }

        private void initialize(){
            QApplication.initialize(null);
            page.loadFinished.connect(this, "render(Boolean)");
            try {
                page.mainFrame().setHtml(readFileAsString(file), new QUrl(baseUrl));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            finished.connect(QApplication.instance(), "quit()");
            QApplication.exec();
        }

        void render(Boolean b) {
            page.setViewportSize(page.mainFrame().contentsSize());
            QImage image = new QImage(page.viewportSize(), QImage.Format.Format_ARGB32);
            QPainter painter = new QPainter(image);

            page.mainFrame().render(painter);
            painter.end();
            image.save(writeTo);
            System.out.println("Saved screenshot as "+writeTo);
            finished.emit();

        }

        private static String readFileAsString(String filePath) throws java.io.IOException {
            StringBuffer fileData = new StringBuffer(1000);
            BufferedReader reader = new BufferedReader(new FileReader(filePath));
            char[] buf = new char[1024];
            int numRead = 0;
            while ((numRead = reader.read(buf)) != -1) {
                String readData = String.valueOf(buf, 0, numRead);
                fileData.append(readData);
                buf = new char[1024];
            }
            reader.close();
            return fileData.toString();
        }
    }

}

This doesn not work and the application crashes with a fatal error:

# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x670ddc30, pid=4588, tid=2776
#
# JRE version: 6.0_17-b04
# Java VM: Java HotSpot(TM) Client VM (14.3-b01 mixed mode windows-x86 )
# Problematic frame:
# C  [QtCore4.dll+0xddc30]

Does anyone have an idea how to initialize the QApplication outside of the main method.

Thanks a lot for your help Marc