Seite 1 von 1
[gelöst] QTextBrowser: Link/Anker in html Datei Problem
Verfasst: 8. Dezember 2008 18:36
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
Re: QTextBrowser und interne Links zu Überschr. in html Date
Verfasst: 9. Dezember 2008 07:31
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
Aha, Anker
Verfasst: 9. Dezember 2008 08:17
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ß
kein Erfolg gehabt
Verfasst: 9. Dezember 2008 08:43
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.

neue Erkenntnisse
Verfasst: 10. Dezember 2008 06:41
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);
}
openLinks alleine aktiviert öffnet die Anker, keine Lösung
Verfasst: 10. Dezember 2008 08:47
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 &)));
vorerst erledigt
Verfasst: 10. Dezember 2008 09:33
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
}