2010-01-12 4 views
1

Je souhaite afficher à l'utilisateur un avertissement QMessageBox avec un lien à l'intérieur. C'est relativement facile, je dois juste m'assurer que je mets le format de texte de RichText sur la boîte de message et l'installation QMessageBox fait le reste. Cependant, je voudrais également fermer la boîte de message (comme dans some-call-call-to done()) si l'utilisateur clique sur le lien - la sémantique étant que l'utilisateur a accusé réception du message et pris une décision.Connexion à un signal masqué par QMessageBox

Le problème: QMessageBox masque le signal linkActivated provenant de son interne (qui est utilisé pour stocker le texte).

Je pensais que je pouvais étendre la classe QMessageBox et faire ce hack très laid dans le constructeur:

QLabel *lbl = findChild<QLabel*>(QString("qt_msgbox_label")); 
assert(lbl != NULL); 

connect(lbl, SIGNAL(linkActivated(const QString&)), this, SLOT(handle_link_activation(const QString&))); 

mais bien que l'étiquette trouvée avec findChild est non nul, et le "qt_msgbox_label" est certainement correct (c/p 'ed de la source), et il n'y a pas de message "no such signal/slot", mon slot n'est jamais appelé quand je clique sur le lien.

Je voudrais éviter d'écrire mon propre QDialog qui imiterait le comportement QMessageBox. Est-ce que quelqu'un a une idée sur la façon dont je peux attraper ce signal?

Répondre

2

Essayez de définir votre propre lien "protocole" à savoir msgboxurl: //yoururl.is.here et installe un gestionnaire d'URL pour elle

QDesktopServices::setUrlHandler("msgboxurl", urlHandlerObj, "slotName");

urlHandlerObj peut être objet créé boîte de message. Dans la fente vous pouvez juste cacher votre boîte de message et prendre l'url partie après // et l'ouvrir avec QDesktopServices::openUrl mais rappelez-vous que vous devez préfixer préfixe http/https (sur certaines plates-formes url sans "schéma" n'est pas géré correctement). L'url de gestion des emplacements doit avoir les mêmes paramètres que QDesktopServices::openUrl méthode statique

+0

Merci pour cela - cela m'a aidé à comprendre la grande partie qui me manquait (et je cite): 'openExternalLinks: Spécifie si QLabel doit automatiquement ouvrir les liens en utilisant QDesktopServices :: openUrl() au lieu d'émettre le signal linkActivated(). – laura

Questions connexes