QWebView als ActiveX Control zeigt Seitenquelltext an.

Verschiedenes zu Qt
Antworten
harry_m
Beiträge: 74
Registriert: 26. April 2010 23:16

QWebView als ActiveX Control zeigt Seitenquelltext an.

Beitrag von harry_m »

Nachdem viele Probleme überwunden wurden, habe ich es geschafft QWebView in ein ActiveX Control zu packen.

Es soll im Siemens WinCC v.7.0 in eine Anzeige eingebunden werden: und das funktionierte auch (dort gibt es bereits ein "WebControl": das scheint ein ewig alter IE zu sein, der die gesamte Runtime irgendwann einfrieren lässt. Daher habe ich versucht, einen Ersatz zu besorgen)

Es läuft eine Weile: ich kann mehrere Male zu anderen Seiten wechseln und alles ist bestens (mein "WebControl" ist auch deutlich schneller, als das hauseigene "WebView" Control).

Bis irgendwann im QWebView Fenster nur noch der Seitenquelltext angezeigt wird. Ist es einmal passiert, dann gibt es kein Entkommen: in diesem Fall hilft nur noch die gesamte WinCC Runtime zu beenden und neu zu starten.

Erst dachte ich mir, dass hier ähnlich wie im Firefox oder IE die Seitenquelltext Anzeige "irgendwie" aktiviert wird. "Alles klar, ich bin ja klug, dann schalte ich eben wieder zurück"- Dachte ich mir. Bis ich festgestellt habe, dass ich so eine Methode gar nicht finden kann.

Jetzt bin habe ich nach einem langen Kampf mein heiß ersehntes Control und kann es nicht verwenden...

Hätte jemand vielleicht eine Idee oder einen Tipp?!

Gruß
Harry

Code: Alles auswählen

include <QtWebKit/QWebView>
#include <QWebSettings>
#include <QWebPage>
#include <QDesktopServices>
#include "webcontrol.h"
#include "objectsafetyimpl.h"

WebControl::WebControl(QWidget *parent) :
    QWidget(parent)
{
	urlEdit = new QLineEdit(this);		// URL Eingabefeld definieren
    urlEdit->setSizePolicy(QSizePolicy::Expanding,
                           urlEdit->sizePolicy().verticalPolicy() );

    webView = new QWebView(this);
	
	webView->settings()->setAttribute(QWebSettings::JavaEnabled, true);
    webView->settings()->setAttribute(QWebSettings::JavascriptEnabled, true);
    webView->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
    webView->settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows, true);

    webView->page()->settings()->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls,true);
    webView->page()->settings()->setAttribute(QWebSettings::LocalContentCanAccessFileUrls,true);
    webView->page()->settings()->setAttribute(QWebSettings::LocalStorageEnabled,true);
    webView->page()->settings()->setAttribute(QWebSettings::AutoLoadImages,true);

    webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);    //Handle link clicks by yourself

	    // Werkzeugleiste mit einfachen Navigations-Elementen
    QToolBar *toolBar = new QToolBar(tr("Navigation"));
    toolBar->addAction(webView->pageAction(QWebPage::Back));
    toolBar->addAction(webView->pageAction(QWebPage::Forward));
    toolBar->addAction(webView->pageAction(QWebPage::Reload));
    toolBar->addAction(webView->pageAction(QWebPage::Stop));
    toolBar->addWidget(urlEdit);
	QStringList strList;

    mainLayout = new QGridLayout(this);
	mainLayout->addWidget(toolBar, 1, 0);
    mainLayout->addWidget(webView, 2, 0);

    setLayout(mainLayout);
	webView->show();
	webView->load(QUrl("http://derstandard.at/Web"));

	connect(urlEdit, SIGNAL(returnPressed()),
            SLOT(startLoading()) );
	
    connect( webView, SIGNAL( linkClicked( QUrl ) ),
                  this, SLOT( linkClickedSlot( QUrl ) ) );

	QString libPath = QString("C:/WinCC_Config/WebControl/plugins");
    QCoreApplication::addLibraryPath(libPath);
    QStringList libPaths;
    libPaths << libPath;
    QCoreApplication::setLibraryPaths(libPaths);
}

WebControl::~WebControl()
{

}

void WebControl::loadUrl(QString &url)	// das ist ein Slot!!!
{
	    webView->load(QUrl(url));
        // webView->load(QUrl("http://www.visaton.de"));
}

void WebControl::setUrl(QString &url)	// das ist eine Methode!
{
	if((url != url2) && requestPropertyChange("targetUrl"))
	{
		url2 = url;
        webView->load(QUrl(url));
		update();
	  	propertyChanged("targetUrl");
	}
}

void WebControl::startLoading()
{
    QUrl url = QUrl(urlEdit->text());
    webView->load(url);
    webView->setFocus();
}

// Click Handler
void WebControl::linkClickedSlot( QUrl url )
{
    QString urlString = url.toString();     // URL in ein String umwandeln
    if (urlString.contains(".jpg", Qt::CaseInsensitive) || urlString.contains(".pdf"), Qt::CaseInsensitive)
        // wenn in de URL auf ein ".jpg" oder ".pdf" Doument zeigt:
        QDesktopServices::openUrl( url );   // Standard Applikation des Systems aufrufen
    else
         webView->load (url);   // ansonsten die URL im WebView anzeigen.
}
QAxAggregated *WebControl::createAggregate()
{
    return new ObjectSafetyImpl;
}

Code: Alles auswählen

#ifndef MAINFORM_H
#define MAINFORM_H

#include <QtGui>
#include <QWidget>
#include <QtWebKit>
#include <QAxBindable>

class WebControl : public QWidget, public QAxBindable
{
    Q_OBJECT
    Q_PROPERTY(QString targetUrl READ targetUrl WRITE setUrl)
    
public:
    WebControl(QWidget *parent);
    ~WebControl();

	void setUrl(QString &url);
	QString targetUrl() const {return url2;}

	QAxAggregated *createAggregate();

public slots:
    void loadUrl(QString &url);

private slots:
    void startLoading();
//	void whileLoading();
//  void setProgress(int p);
//  void finishLoading(bool);
	void linkClickedSlot(QUrl url);
    
private:
        // QLabel              *labelURL;
		QLineEdit           *urlEdit;
        QWebView            *webView;
        QGridLayout         *mainLayout;
		QString				url2;
};

#endif // MAINFORM_H
Zwei Tragödien gibt es im Leben: die eine - nicht zu bekommen, was das Herz wünscht, und die andere: es doch zu bekommen. (Oscar Wilde)
Antworten