2017-08-22 2 views
0

Ich habe einige Labels und Layouts in einem QWidget verschachtelt, um einen Teil einer Sidebar zu erstellen. Jedes QWidget ist eine eigene Sektion und eine Komponente sieht derzeit wie folgt aus:Wie Hyperlinks in Qt ohne QLabel hinzufügen?

screenshot of gui

Zu meinem Verständnis, können Sie nur Satz Hyperlinks mit QLabel, aber ich versuche, das ganze Gebiet zwischen den weißen Linien zu bekommen klickbare . Dies umfasst das Symbol und den Leerraum. Gibt es einen Weg, dies zu erreichen?

Dies wurde als ein Duplikat markiert, das Gegenteil von dem, was ich gefragt habe, also möchte ich wiederholen, dass ich versuche, einen Hyperlink ohne QLabel zu implementieren.

+1

Sorry, mein Schlechter, es ist 3 Uhr hier. Ich sah QLabel und Hyperlink und war wie "oh nicht das schon wieder": D – dtech

+0

@dtech keine Sorgen !! es passiert :) – xkenshin14x

+2

Probieren Sie 'QDesktopServices :: openUrl (yourURL)' im Mausklick-Handler. – dtech

Antwort

2

Sie ein Widget öffnen einen Link auf Klick leicht haben können folgende verwendet Sie können zusätzliche Signale und Verbindungen vermeiden, und jedes Link-Widget speichert seinen eigenen Link intern. Die URL kann auf Konstruktion festgelegt und jederzeit geändert werden. Wenn Sie keine Signale und Slots verwenden, können Sie auch die Verbindung einfacher ändern, ohne vorherige Verbindungen trennen zu müssen.

IMO gehen für eine Lösung von Signalen und Slots ist nur gerechtfertigt, wenn Sie verschiedene willkürliche Verhalten wollen. In diesem Fall wollen Sie immer das gleiche - um einen bestimmten Link zu öffnen, also können Sie das genauso gut programmieren und eine einfachere und recheneffizientere Lösung wählen.

+0

Das hat perfekt funktioniert! Wusste nicht, dass Sie mouseReleaseEvent so verwenden könnten. Vielen Dank :) – xkenshin14x

1

Ich würde einfach nur das Signal für clicked() fangen und Desktop-Dienste verwenden, um die URL im Code zu öffnen.

bool QDesktopServices::openUrl (const QUrl & url) [static] 

öffnet die angegebene URL in dem entsprechenden Web-Browser für den Desktop-Umgebung des Benutzers und gibt true zurück, wenn sie erfolgreich ist; Andernfalls wird false zurückgegeben.

http://doc.qt.io/qt-4.8/signalsandslots.html

diese Art von Syntax verwenden, oder im Designer, können Sie auch ein Signal an einen Steckplatz angeschlossen werden.

connect(widgetThatRepresentsURL, SIGNAL(clicked()), 
    handlerThatWillOpenTheURL, SLOT(clicked_on_url())); 

Für Widgets, die für klickten einrichten kein Signal haben (oder was auch immer Fall, dass Sie interessiert sind), können Sie das Widget in Frage Unterklasse und reimplementieren ...

void QWidget::mousePressEvent (QMouseEvent * event) [virtual protected] 

Speziell Zum Erzeugen eines Signals gibt es emit.

class Link : public QWidget { 
    Q_OBJECT 
    public: 
    Link(QUrl url, QWidget p = nullptr) : QWidget(p), _url(url) {} 
    QUrl _url; 
    void mouseReleaseEvent(QMouseEvent *) { QDesktopServices::openUrl(_url); } 
} 

: Ich habe dies in der Vergangenheit wie die

void Cell::focusInEvent(QFocusEvent *e) 
{ 
    emit focus(this, true); 
    QLineEdit::focusInEvent(e); 
} 

mit folgendem im Header

signals: 
    void focus(Cell *, bool); 
+1

In QWidget wurde kein Signal geklickt. – dtech

+0

Sie können einen Ereignishandler erstellen oder den Ereignishandler erneut implementieren. Ich werde die Antwort für Sie hinzufügen. – Josh

Verwandte Themen