Проблема QTextDocument со ссылками HTML

Я создаю простой виджет Marquee с использованием PyQt5 для отображения некоторых новостей, которые должны прокручиваться слева направо. Текст новости должен содержать ссылки, чтобы пользователь мог щелкнуть по ним и прочитать полную новость (на веб-сайте). Я использую QTextDocument для отображения заголовков новостей (вместе с URL-адресами href) в HTML: хотя HTML отображается отлично, я не могу щелкнуть сгенерированный тег href. Здесь ниже код, который я использую:

class MarqueeLabel(QLabel):
    px = 0
    py = 0 
    paused = False
    qthread = None
    refresh_msec = 30 
    textDocument = None
    textWidth = 0
    timer = None

    def __init__(self, parent=None):
        QLabel.__init__(self, parent)
        self.initUI()

    def initUI(self):
        self.setFixedSize(433, 40)
        self.setStyleSheet("""
        QLabel {
            background: transparent;
            color: #484848;
        }
        """)

    def parseFeed(self):

        class FeedParser(QThread):

            msignal = pyqtSignal(list, list)

            def run(self):
                try:
                    feed = feedparser.parse(URL)
                except Exception, e:
                    pass
                else:
                    feedhtml = []
                    feedtext = []
                    for item in feed['entries']:
                        feedhtml.append('%(TEXT)s (<a href="%(LINK)s">read more</a>)' % dict(LINK=item['link'], TEXT=item['title']))
                        feedtext.append('%s (read more)' % item['title'])
                    self.msignal.emit(feedhtml, feedtext)

        self.qthread = FeedParser(self)
        self.qthread.msignal.connect(self.setMarqueeText)
        self.qthread.finished.connect(self.start)
        self.qthread.start()

    @pyqtSlot(list, list)
    def setMarqueeText(self, feedhtml, feedtext):
        ## FIXME: the 1.1 multiplier should not be here, but without the text goes on 2 lines!
        plaintext = ' - '.join(feedtext)
        self.textWidth = self.fontMetrics().boundingRect(plaintext).width() * 1.1
        self.textDocument = QTextDocument(self)
        self.textDocument.setUndoRedoEnabled(False)
        self.textDocument.setUseDesignMetrics(True)
        self.textDocument.setTextWidth(self.textWidth)
        self.textDocument.setHtml(' - '.join(feedhtml))
        self.px = self.width()
        self.py = self.height() - self.fontMetrics().boundingRect(plaintext).height() - 6

    def start(self):
        if self.textDocument:
            self.timer = QTimer(self)
            self.timer.timeout.connect(self.scrollText)
            self.timer.start(self.refresh_msec)

    def event(self, event):
        if event.type() == QEvent.Enter:
            self.paused = True
        elif event.type() == QEvent.Leave:
            self.paused = False
        return QLabel.event(self, event)

    def paintEvent(self, QPaintEvent):
        if self.textDocument:
            p = QPainter(self)
            p.translate(self.px, self.py)
            self.textDocument.drawContents(p, QRectF(self.rect()))

    def scrollText(self):
        if not self.paused:
            if -self.px > self.textWidth:
                self.px = self.width()
            else:
                self.px -= 1
        self.repaint()

И это скриншот, который показывает, что HTML отображается правильно, несмотря на то, что нажатие на URL-адрес ничего не делает? Любой намек?

скриншот


person Daniele Pantaleone    schedule 06.06.2015    source источник


Ответы (1)


Поскольку вы используете QLabel, это должно быть тривиально. Просто используйте подходящий Qt::TextInteractionFlags. В вашем случае это будет Qt::LinksAccessibleByMouse.

Документация ясно говорит вам:

enum  Qt::TextInteractionFlags
flags Qt::TextInteractionFlags

...
Qt::LinksAccessibleByMouse      4   Links can be highlighted and activated with the mouse.
Qt::LinksAccessibleByKeyboard   8   Links can be focused using tab and activated with enter.
...
person Marcus    schedule 15.03.2016