[gelöst] QTextBrowser: Link/Anker in html Datei Problem

Verschiedenes zu Qt
Antworten
s-valve
Beiträge: 87
Registriert: 1. April 2007 15:03
Kontaktdaten:

[gelöst] QTextBrowser: Link/Anker in html Datei Problem

Beitrag von s-valve »

Hallo,

ich möchte in QTextBrowser eine HTML Seite anzeigen. Habe ein Widget mit dem Designer erstellt, welches drei Buttons enthält (<-, ->, home) und einen QTextBrowser. Im Designer habe ich openLinks und openExternalLinks auf true gesetzt.

In meinen Programm öffnet sich das Widget samt der zu ladenden Datei auch

Code: Alles auswählen

path << (QApplication::applicationDirPath() + "/Help/");
helpBrowser->setSearchPaths(path); 
helpBrowser->setSource(QUrl("index.html")); 
Ich habe in der html Datei nun allerdings interne Links zu Überschriften verwendet, welche nicht ausgeführt werden. Im Webbrowser funktionieren sie jedoch:
html code Überschrift: <h1 id="h1_about" align="left">About the App</h1>
html code des Links zur Überschrift: <a href="#h1_about"><b>About</b></a><br>

Interessanterweise öffnet der QTextBrowser die externen Links problemlos mit meinem Webbrowser:
externer Link: <a href="http://plcedit.org" target="_blank"><img src="PLCE_winlinuxmac.png" alt="PLCEdit on win32/linux/mac os x" /></a>
Kann QTextbrowser nichts mit den Überschriftenlinks anfangen oder steckt der Fehler in einem vergessenen Flag für den Browser?

Grüße,
M
Zuletzt geändert von s-valve am 10. Dezember 2008 09:38, insgesamt 1-mal geändert.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: QTextBrowser und interne Links zu Überschr. in html Date

Beitrag von macman »

s-valve hat geschrieben:Ich habe in der html Datei nun allerdings interne Links zu Überschriften verwendet, welche nicht ausgeführt werden. Im Webbrowser funktionieren sie jedoch:
Lass mich raten, das funktioniert mit dem Internet Explorer :-) Bei dem könnte ich mir vorstellen, das er solche Fehler toleriert.

Das Attribut 'id' wird im Zusammenhang mit CSS genutzt und nicht mit Verweisen. Um Anker innerhalb einer Seite zu nutzen, so heißen die Dinger nämlich, nimmt man die Kombination aus "<a href='#myName'>Verweis</a>" und "<a name='myName'>Verweis</a>.
Siehe auch http://de.selfhtml.org/html/verweise/pr ... .htm#anker
s-valve
Beiträge: 87
Registriert: 1. April 2007 15:03
Kontaktdaten:

Aha, Anker

Beitrag von s-valve »

Danke für den Hinweis.
Habe mit internen Überschriftenlinks nicht so die Erfahrung und mir das auf selfhtml rausgesucht und allen Browser hat das geschmeckt: IE, FireFox, Safari, Opera, usw.
Ich werde mich dann noch mal auf selfhtml begeben und die Änderung mit dem Anker ausprobieren.

Gruß
Zuletzt geändert von s-valve am 9. Dezember 2008 09:37, insgesamt 1-mal geändert.
s-valve
Beiträge: 87
Registriert: 1. April 2007 15:03
Kontaktdaten:

kein Erfolg gehabt

Beitrag von s-valve »

Jetzt wird es interessant. Ich habe die Seite bei selfhtml gelesen und dort steht "Denn seit HTML 4 können Anker alleine mit dem Universalattribut id anstelle eines a-Elements mit name-Attribut notiert werden". QTextBrowser gibt bei seiner Eigenschaft html selbt HTML 4.0 an im Designer.

Davon mal ab, das Beispiel bei selfhtml "frisst" QTextBrower auch nicht. Die Verweise zu den Ankern sind dort auch tot.
Ebeso, wenn ich im Designer den QTextBrowser mit solchem Inhalt fülle und dort teste...

Ansich erkennt QTextBrowser, dass es sich um Verweise handelt, denn es ändert sich der Mauszeiger von Pfeil in Hand.
Ist es doch vlt. etwas anderes, irgend eine Einstellung die nicht i.O. ist?

Grüße,
M


EDIT:
Wenn ich den QTextBrowser aufrufe und ihm mitteile, dass er an einen Anker scrollen soll macht er das unter der Vorausetzung, dass der Anker mit id="ANKERNAME" oder name="ANKERNAME" gekennzeichnet ist und keine Sonderzeichen wie "_" enthält. Im QTextBrowser dann allerdings auf einen Verweis zum Anker klicken funnktioniert nicht (<a href"#ANKERNAME">mein anker</a>).
Eine ordentliche Signal Slot-Kombination in QTextBrowser, mit der ich einen angeklickten Anker "anscrollen" kann, habe ich noch nicht gefunden. :?
s-valve
Beiträge: 87
Registriert: 1. April 2007 15:03
Kontaktdaten:

neue Erkenntnisse

Beitrag von s-valve »

Ich habe mal weiter probiert. Mir scheint es, als wenn QTextBrowser mit den Verweisen Probleme hat.
Da QTextBrowser den internen Verweis nicht öffnen wollte, habe ich mir eine SIGNAL-SLOT Kombination erstellt. Zu Beginn erst mal mit dem Signal highlighted, später dann mit anchorClicked. Es funktioniert nur highlighted :(
Es ist egal ob ich <h1 id=""> oder <a name=""> für die Ankerangabe nutze.
So, jetzt bin ich mit meinem Latein am Ende...

Code: Alles auswählen

HelpWidget::HelpWidget(QWidget *parent=0) 
	: QWidget(parent)
{
  setupUi(this);
  
  setHelpFile(); //set searchpath + source
  HelpWidget_textbrowser->openLinks(); //activate openLinks 
  HelpWidget_textbrowser->scrollToAnchor("h1quickguide"); //test scrolling to anchors
 
//connection to show anchors
  //connect(HelpWidget_textbrowser, SIGNAL(highlighted(const QUrl &)), this, SLOT(showAnchor(const QUrl &)));
  connect(HelpWidget_textbrowser, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(showAnchor(const QUrl &)));
  
}

void HelpWidget::showAnchor(const QUrl &link)
{ //scroll to anchor

  QString str = link.toString();
  str = str.remove(0, str.indexOf("#")+1).simplified();
  //QMessageBox::critical(this, "link: ", str);
  HelpWidget_textbrowser->scrollToAnchor(str);
}
s-valve
Beiträge: 87
Registriert: 1. April 2007 15:03
Kontaktdaten:

openLinks alleine aktiviert öffnet die Anker, keine Lösung

Beitrag von s-valve »

Und weiter gehts.
Ich habe im Designer die Häkchen für openLinks und openExternalLinks entfernt und diese dann versucht im Programm zu setzen.
Ist openExternalLinks auf true gesetzt, werden die internen Anker ignoriert - steht quasi auch so in der Doku...
Ist openLinks allein auf true gesetzt werden die Anker korrekt angesprungen.
Die externen Links in meiner Datei wollte ich schon gern behalten und die internen Anker für das Inhaltsverzeichnis sind sicher ebenso nicht wegzudenken.
Falls jemand noch eine Idee hat wie man beides zum einträchtigen nebeneinander bewegen kann oder meint, ich hätte einen Fehler gemacht, habe ich ein Paket mit der ui und der source angehängt.

Code: Alles auswählen

  setHelpFile((QApplication::applicationDirPath() + "/Help/"), "index.html");
  HelpWidget_textbrowser->setOpenLinks(true);
  //HelpWidget_textbrowser->setOpenExternalLinks(true);
  
  connect(HelpWidget_textbrowser, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(showAnchor(const QUrl &)));
Dateianhänge
HelpWidget.zip
(9.88 KiB) 172-mal heruntergeladen
s-valve
Beiträge: 87
Registriert: 1. April 2007 15:03
Kontaktdaten:

vorerst erledigt

Beitrag von s-valve »

So, ich schließe das hier jetzt mal ab, da ich mich dazu durchgerungen habe einen workaround der externe-Links Verarbeitung zu erstellen.
Anbei die vom Code her vlt. etwas grobe Lösung:

Code: Alles auswählen

#include <QtGui>
#include <QDesktopServices>

#include "helpwidget.h"


HelpWidget::HelpWidget(QWidget *parent=0) 
	: QWidget(parent)
{
  setupUi(this);
  
  HelpWidget_textbrowser->setOpenLinks(true);
  //setup help file for browser
  setHelpFile((QApplication::applicationDirPath() + "/Help/"), "index.html");
  
  //diverse connections
  connect(HelpWidget_textbrowser, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(checkAnchor(const QUrl &)));
}

HelpWidget::~HelpWidget()
{ //virtual destructor
}


void HelpWidget::checkAnchor(const QUrl &link)
{ //scroll to anchor

  QString str = link.toString();				//get string from url

  if (!str.contains("#") == true)				//check if internal anchor
  { //handle external links
    bool ok = QDesktopServices::openUrl(link);	//open external link with QDS
    setHelpFile((QApplication::applicationDirPath() + "/Help/"), "index.html");//reset help file <-- workaround bec. openExternaLinks & openLinks working not together
  }
}

 
void HelpWidget::setHelpFile(QString filePath, QString file)
{ //set help file path

  //fill textbrowser with help file
  QStringList path;
  path << (filePath);							//set path
  HelpWidget_textbrowser->setSearchPaths(path);	//set search path 
  HelpWidget_textbrowser->setSource(QUrl(file));//set file source
}
Antworten