Seite 1 von 1

QLabel - Disabeln, wenn Label Link enthält

Verfasst: 1. Februar 2010 10:04
von suamikim
Hallo zusammen,

ich hab die Frage im letzten Posts dieses Threads bereits gestellt. Da sich dort jedoch niemand mehr meldet und es sich ja eigentlich um eine eigene Frage handelt, hier nun ein neuer Thread...

Ich hab ein QLabel, welches als Link dargestellt wird. Die Darstellung als Link (also Blau & Unterstrichen) erfolgt automatisch, wenn der entsprechende HTML-Code eingetragen wird.

Nun würde ich den Link gerne ab und an disabeln. Soweit auch kein Problem, allerdings wird die Darstellung des QLabels nun gar nicht geändert, dh. der Link ist weiterhin blau & unterstrichen. Ich hätte ihn aber gerne, wie gewohnt ausgegraut, damit man auch auf den 1. Blick erkennt, dass der Link disabled ist...

Wie kann ich das nun erreichen?

danke, mfg

mik

Verfasst: 1. Februar 2010 10:19
von AuE
setz ein Property für das Label (zB visited=true) und setz ein Stylesheet für das Label. Siehe Hilfe ==> führt genau zu dem was du willst!

Verfasst: 1. Februar 2010 17:24
von suamikim
Hm, ich hab jetzt mal ein wenig mit den Style-Sheets herumgespielt und muss sagen, dass ich das Konzept bisher nicht kannte und es recht interessant finde!

Mein Problem konnte ich bisher allerdings noch nicht lösen:

Wenn ich ein normales QLabel (also ohne Link, ganz normaler schwarzer Text) hernehme und folgenden Code einfüge wird der Text rot, sobald ich das Property enabled=false setze (ist das Label enabled=true wird es erwartungsgemäß im Standard-Schwarz angezeigt):

Code: Alles auswählen

m_ui->lblPrevTest->setStyleSheet(":disabled { color: red }");
Der selbe Code auf mein QLabel mit dem Link angewandt bringt leider keine Änderung.
Wenn ich allerdings ein anderes Attribut setze (zB. ":disabled { background: red }") wird dies durchaus richtig übernommen (dh. enabled ist der Hintergrund normal durchsichtig bzw. im Grau des übergeordneten Widgets, disabled wird der Hintergrund rot).

Warum wird das Attribut "color" nun nicht richtig übernommen, wenn es sich um einen Link handelt, den das QLabel darstellt und was kann ich dagegen machen?

danke, mfg

Verfasst: 1. Februar 2010 18:40
von AuE
Lass mich raten..... den Text hast du via Edit Text Funktion verändert oder?

Schau dir da mal den Srx an. Da Steht bei mir dann :

Code: Alles auswählen

<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="www.trolltech.com"><span style=" text-decoration: underline; color:#0000ff;">TextLabel</span></a></p></body></html>
Da wird quasi die Farbe gesetzt (was davon jetzt genau die Oberhand hat (Stylesheet oder HTML Formatierung) weiß ich nicht. Aber schau doich mal an wie man soetwas via HTML lösen kann. Habs grad net zur Hand aber da gabs doch was.

Ich vermute (weiss es nicht) das der Stylesheet nicht diesen HTML überschreibt. Kannst ja mal versuchen die Color rauszunehmen beim HTML oder so

Verfasst: 1. Februar 2010 18:45
von AuE
Hab grade nochmal rumgespielt..... du musst dir mal den Src Text ansehen nachdem du das Stylesheet via Designer zB gesetzt hast => Da waren bei mir zunächst die Sachen die ich via Stylesheet drin hate, weiter unten kamen die Sachen wie der Text im Editor quasi konfiguriert wurde. Das habe ich bei mir dann rausgenommen und es ging!

Verfasst: 2. Februar 2010 19:44
von suamikim
Hm, ich weiß nicht recht, ob ich verstehe, was du meinst...
weiter unten kamen die Sachen wie der Text im Editor quasi konfiguriert wurde
Meinst du hier die Zeile(n) im ui_-File, in dem setText des QLabels aufgerufen wird?
In dieser Zeile steht einiges an html-Code (zumindest, wenn ich über den Designer einen Link erzeuge wie im letzten Post des anderen Threads beschrieben).

Wenn ich diesen Code rausnehme wird mein Stylesheet durchaus übernommen. Allerdings wird das ganze dann gar nicht mehr als Link dargestellt und somit wird auch das linkActivated-Signal des QLabels niemals gesendet...

Genau hierin besteht ja mein Problem!

Hab jetzt auch noch ein wenig herumprobiert und kann mein Problem relativ weit eingrenzen:

Mit folgendem Code wird mein Stylesheet richtig angewandt (dh. die Schrift des QLabels ist rot, wenn es disabled ist):

Code: Alles auswählen

  m_ui->lblAddUser->setText("Normaler Text");
  m_ui->lblAddUser->setEnabled(false);
  m_ui->lblAddUser->setStyleSheet(":disabled { color: red }");
Nun hab ich aber natürlich das Problem, dass das QLabel nicht als Link dargestellt wird (blau, unterstrichen) wenn es enabled ist und somit auch bei klick mit der Maus darauf kein linkActiviated-Signal schickt...

Mit folgendem Code wird der Link richtig dargestellt und das linkActiviated-Signal kommt in meinem verbundenen Slot an, jedoch wird das Label immer gleich gezeichnet, egal ob es enabled oder disabled ist:

Code: Alles auswählen

  m_ui->lblAddUser->setText("<a href=\"AddUser\">Ein Link</a>");
  m_ui->lblAddUser->setEnabled(false);
  m_ui->lblAddUser->setStyleSheet(":disabled { color: red }");
Es sieht also so aus, als ob das Stylesheet ignoriert wird, sobald das QLabel html-Code darstellen soll bzw. darstellt.

Wer weiß, was ich dagegen machen kann und wie ich den Link trotzdem "disabled darstellen" (also grau) kann?

danke, mfg

Verfasst: 3. Februar 2010 12:19
von suamikim
Ich hab das ganze jetzt etwas "russisch" gelöst:

Für alle Link-Labels einen Event-Filter installiert und ein eigenes Property mit dem anzuzeigenden Text gesetzt:

Code: Alles auswählen

  m_ui->lblLink1->installEventFilter(this);
  m_ui->lblLink1->setProperty("LinkText", tr("Link 1"));
  m_ui->lblLink2->installEventFilter(this);
  m_ui->lblLink2->setProperty("LinkText", tr("Link 2"));
  //...
Im Event-Filter fange ich jetzt das EnabledChanged-Event ab und setzte je nachdem, ob das QLabel enabled oder disabled ist den Text neu (also ganz normaler Text, wenn das QLabel disabled ist, html-Code für den Link, wenn das Label enabled ist):

Code: Alles auswählen

bool TestForm::eventFilter(QObject *obj, QEvent *event)
{
  if (((obj == m_ui->lblLink1) || (obj == m_ui->lblLink2)) && (event->type() == QEvent::EnabledChange))
  {
    QLabel *pLblObj = (QLabel*)obj;
    QString qStrText = pLblObj->property("LinkText").toString();
    pLblObj->setText(pLblObj->isEnabled() ? tr("<a href=%1>%1</a>").arg(qStrText) : qStrText);
  }

  return QObject::eventFilter(obj, event);
}
Falls mal jemand vor dem selben Problem stehen sollte...

Natürlich wäre ich nach wie vor an einer etwas "eleganteren" Lösung interessiert (falls diese existiert)...

danke, mfg