Я создаю простой виджет 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-адрес ничего не делает? Любой намек?