PySide/PyQt: возможно ли сделать строки, которые вы прикрепляете к QTextBrowser, отдельными интерактивными единицами

Это может быть глупый вопрос, но:

Когда вы добавляете заданную строку к объекту QTextBrowser, можете ли вы сделать ее ссылкой на сигнал функции, которая берет ее текст и что-то с ним делает? Все, что мне нужно, это сохранить текст в переменной.

Например, может ли ссылка вести к функции, а не к веб-сайту.


person UrbKr    schedule 18.10.2013    source источник


Ответы (1)


Это, безусловно, возможно.

Вот пример кода:

import sys

from PyQt4 import QtGui
from PyQt4 import QtCore

class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        main_layout = QtGui.QVBoxLayout()

        self.browser = QtGui.QTextBrowser()
        self.browser.setHtml('''<html><body>some text<br/><a href="some_special_identifier://a_function">click me to call a function</a><br/>
        <a href="#my_anchor">Click me to scroll down</a><br>foo<br>foo<br>foo<br>foo<br>foo<br>foo<br>
        foo<a id="my_anchor"></a><br>bar<br>bar<br>bar<br>bar<br>bar<br>bar<br>hello!<br>hello!<br>hello!<br>hello!<br>hello!<br>hello!<br>hello!<br>hello!</body></html''')

        self.browser.anchorClicked.connect(self.on_anchor_clicked)

        main_layout.addWidget(self.browser)

        self.setLayout(main_layout)

    def on_anchor_clicked(self,url):
        text = str(url.toString())
        if text.startswith('some_special_identifier://'):
            self.browser.setSource(QtCore.QUrl()) #stops the page from changing
            function = text.replace('some_special_identifier://','')
            if hasattr(self,function):
                getattr(self,function)()

    def a_function(self):
        print 'you called?'

app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()

sys.exit(app.exec_())

Любая ссылка с URL-адресом, начинающимся с «some_special_identifier://», будет выбрана, а текст после этого будет использоваться для поиска и вызова функции с тем же именем. Обратите внимание, что это может быть немного рискованно, поскольку существует возможность вызова всех видов функций, которые, возможно, вы не намерены использовать, если пользователь имеет какой-либо контроль над тем, что отображается в TextBrowser. Возможно, лучше разрешить запуск только определенных функций и, возможно, только в определенное время. Это, конечно, зависит от вас, чтобы обеспечить соблюдение!

P.S. мой код написан для Python 2.7 (я вижу, вы используете Python 3). Так что я думаю, вам нужно как минимум изменить print 'text' на print('text')!

person three_pineapples    schedule 20.10.2013