Не удалось открыть гиперссылку с ShellExecute (ошибка 2) - PullRequest
0 голосов
/ 31 августа 2018

У меня есть приложение, разработанное с использованием PYQT5, в этом приложении у меня есть строка в QtableWidget с гиперссылкой QLabel на отчет. Отчет сохраняется локально, хотя в будущем он может находиться в общей сетевой папке.

Ради этого вопроса, скажем, у меня есть отчет о моем локальном диске в этом месте:

C:\my\report\location\report.html

Однако, когда я нажимаю на ссылку, чтобы открыть отчет в веб-браузере, в окне консоли появляется сообщение:

ShellExecute 'c:%5Cmy%5Creport%5Clocation%5Creport.html' failed (error 2).

Очевидно, что в скрипте есть проблемы со свойством обратной косой черты '\', но я не могу найти способ предотвратить это.

Вот мой код на основе pyqt для генерации гиперссылки в QTableWidget:

reportLink = " <a href=\"{url}\"> <font face=Tw Cen MT Condensed size=2 color=black>Report</font> </a>"\
    .format(url=outcome_dict['report_location'])
report_lbl = QtWidgets.QLabel()
report_lbl.setText(reportLink)
report_lbl.setOpenExternalLinks(True)

self.ui.my_table.setCellWidget(self.row, 6, report_lbl)

А вот мой фрагмент кода, когда пользователь щелкает гиперссылку отчета в QTableWidget:

def html_clicked(self, mi):
    self.column = mi.column()
    if self.column == 6:
        try:
            for ref in self.ui.my_table.selectedIndexes():
                self.link = self.ui.my_table.item(int(ref.row()), 6).text()
            webbrowser.open(self.link)
        except Exception as e:
            print(e)                
    else:
        pass

1 Ответ

0 голосов
/ 31 августа 2018

Нет необходимости использовать webbrowser.open (...), QLabel укажет, что будет эта ссылка, но для этого необходимо, чтобы URL был правильным, в случае локального файла URL - это file:///path/of/file, тогда для получения этого URL-адреса с использованием пути необходимо использовать QUrl::fromLocalFile(), пример:

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self.ui = ...
        self.ui.setupUi(self)

        d = [{"report_location": r"C:\my\report\location\report.html" },
             {"report_location": r"C:\Users\IEUser\Desktop\index.html" }]

        self.ui.my_table.setColumnCount(7)
        self.ui.my_table.setRowCount(2)

        for row, outcome_dict in enumerate(d):
            url = QtCore.QUrl.fromLocalFile(outcome_dict['report_location']).toString()
            reportLink = "<a href=\"{url}\"> <font face=Tw Cen MT Condensed size=2 color=black>Report</font> </a>"\
                        .format(url=url)
            report_lbl = QtWidgets.QLabel()
            report_lbl.setText(reportLink)
            report_lbl.setOpenExternalLinks(True)
            self.ui.my_table.setCellWidget(row, 6, report_lbl)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...