Label с HyperLink

110
08 января 2021, 12:30

У меня есть QLabel, его размер 400x400 и в тексте прописано:

<a href='-'>Link</a>

Мне нужно, чтобы тег a растянулся на весь QLabel или был такого же размера как QLabel.

width и height не работает!

Как это можно сделать?

Answer 1

Нужен класс, наследник QObject, в котором необходимо переопределить виртуальную функцию eventFilter(QObject*, QEvent*). Допустим, что лэйбл label располагается на форме ui класса MainWindow. В нём же переопределим вышеобозначенную функцию:

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(watched->objectName() == "label") {
        switch (event->type()) {
        case QEvent::Enter:
            qApp->setOverrideCursor(Qt::PointingHandCursor);
            break;
        case QEvent::Leave:
            qApp->setOverrideCursor(Qt::ArrowCursor);
            break;
        case QEvent::MouseButtonRelease:
        case QEvent::MouseButtonPress: {
            QMouseEvent* mevent = static_cast<QMouseEvent*>(event);
            QLabel* label = static_cast<QLabel*>(watched);
            QFontMetrics metrics( label->font() );
            QTextDocument document;
            document.setHtml(label->text());
            const auto rect = label->rect();
            const auto text = document.toPlainText();
            const auto w = metrics.width(text);
            const auto h = metrics.height();
            const auto align = label->alignment();
            //работает, если текст выравнен следующими способами
            //при необходимости можно обработать остальные случаи
            if(align & Qt::AlignLeft) {
                mevent->setLocalPos(QPoint(w/2,h/2));
            } else
            if(align & Qt::AlignRight){
                mevent->setLocalPos(QPoint(rect.width()-w/2, rect.height()/2-h/2));
            } else
            if(align & Qt::AlignHCenter) {
                mevent->setLocalPos(QPoint(rect.width()/2 , rect.height()/2));
            }
        }
        default: break;
        }
    }
    return false;
}

в конструкторе MainWindow:

ui->label->setOpenExternalLinks(true);
ui->label->installEventFilter(this);
READ ALSO
C++ Вытащить из Char цифры, написанные через пробел

C++ Вытащить из Char цифры, написанные через пробел

есть char b[50] = "11 2 6" или он может быть записан char b[50] = "1 23 6"

119
Как сделать проверку на валидацию перед сабмитом а после показать блок успешной отправки

Как сделать проверку на валидацию перед сабмитом а после показать блок успешной отправки

Надо сделать валидацию перед сабмитом, а после показать блок успешной отправки

102
Как создать массив объектов класса и обращаться к их методам? C# [дубликат]

Как создать массив объектов класса и обращаться к их методам? C# [дубликат]

Вопрос такой, есть у меня массив из объектов класса, например, MyClass:

121